python+unitest 实现业务闭环

2022-11-18  吴水荣 

需求:
1、在cnkdlManage 管理后台使用管理员身份登录后,循环新增5个账号
2、按新增账号时的固定前缀来查询,查出符合条件的5个账号
3、将这5个账号分别设置成为管理员
4、最终将这5个账号全部删除

完整项目
1、新建New Project—-> cnkdMange
2、新建 common 包,放置配置文件
3、新建 testCase 包,放置测试用例
4、新建 testReport 文件夹,放置测试报告
5、新建 tools 包,放置工具类文件
6、新建 runTest.py 写整个项目的入口
7、复制一个 plugins包,里面是第三方写测试报告的方法,直接使用—> HTMLTestRunnerPlugins.py

开始写代码
1、在common 包里新建 config.py 存放配置信息,例如ip地址,端口号等,比如说在写脚本的时候往往是写的测试环境的地址,然后上线后如果需要验证,仅需要在配置文件这里改一下ip和端口号,后面的代码都不需要动

  class Configure:
        base_url = "xxxxxxx.f3322.net"
        port = "8803"
        user_name = "wwwsss"
        user_password = "123456"

2、在tools包里新建 utils.py 文件,存放基本工具类的方法,里面的方法多使用静态方法,其他文件引用时不需要实例化就直接引用

import os
import random
import string
import time
import zipfile
import yagmail
from common.config import Configure
from plugins import HTMLTestRunnerPlugins


class Utils:
    @staticmethod
    def get_base_url():
        """
        获取url
        :return:
        """
        return "http://" + Configure.base_url + ":" + Configure.port + "/admin/apis/"

    @staticmethod
    def get_base_fron_url():
        """
        获取url
        :return:
        """
        return "http://" + Configure.base_url + ":" + Configure.port + "/apis/"

    @staticmethod
    def random_phone_no(start_no=None, digit=11):
        """
        获取随机手机号
        :return:
        """
        no_start = ['132', '134', '135', '136', '137', '138', '139', '150', '180']
        if not start_no:
            start_no = random.choice(no_start)
        end = "".join(random.sample(string.digits, digit - 3))
        return start_no + end

    @staticmethod
    def random_username(start_str=None, digit=10):
        """
        获取随机手机号
        :return:
        """
        str_start = ['wwss', 'ssrr', 'wwsr']
        if not start_str:
            start_str = random.choice(str_start)
        end = "".join(random.sample(string.digits, digit - 3))
        return start_str + end

    @staticmethod
    def get_report_name(test_suite):
        """
        生成一个完整的测试报告名称
        :return:-->rep_dir
        """
        now_time_str = time.strftime("%Y-%m-%d %H.%M.%S")
        rep_dir = "./testReport/" + now_time_str + "_reportResult.html"
        # 创建一个报告,使用二进制流写入
        with open(rep_dir, "wb") as fp:
            # 生成报告,并将报告内容写入fp 报告文件,并获取HTMLTestRunner的操作对像。里面的参数直接在plugins里的文件里按住ctrl点击函数名称,获取里面的参数
            runner = HTMLTestRunnerPlugins.HTMLTestRunner(
                stream=fp,
                title=" cnkdl系统接口测试报告",
                description="cnkdl系统接口测试,包含登录、新建用户、设置角色,删除用户等接口",
                tester="xxxxxx"
            )
            # 执行测试用例并写入测试报告
            runner.run(test_suite)
        return rep_dir

    @staticmethod
    def auto_send_email(to_user, subject, contents, report_dir):
        """
        发送邮件
        :param to_user: 发给谁
        :param subject: 邮件主题
        :param contents: 描述
        :param report_dir: 附件
        :return:
        """
        # 封装发送邮件的服务(需要去配置),即是自己要发出邮件地邮箱
        # password 不是登录邮箱的密码,是一个密钥,需要在邮箱那里获取
        yag_obj = yagmail.SMTP(
            user="xxxxxx_111@163.com",
            password="BZEBQTHCBVALPIYZ",
            host="smtp.163.com"
        )
        return yag_obj.send(to_user, subject, contents, report_dir)

    @staticmethod
    def do_zip_file(dir_path):
        """
        将文件打包成zip文件
        :param dir_path: 需要打包的文件
        :return: 返回打包的完整文件路径地址
        """
        output_name = f"{dir_path}.zip"
        parent_name = os.path.dirname(dir_path)
        zip_file = zipfile.ZipFile(output_name, "w", zipfile.ZIP_DEFLATED)
        # 多层级压缩
        for root, dirs, files in os.walk(dir_path):
            for file in files:
                if str(file).startswith("~$"):
                    continue
                filepath = os.path.join(root, file)
                write_path = os.path.relpath(filepath, parent_name)
                zip_file.write(filepath, write_path)
        zip_file.close()
        return output_name

4、在testCase 写测试用例:test_1_cnkdManage.py

import random
import time
import unittest
from loguru import logger
import requests
from common.config import Configure
from tools.utils import Utils


class CnkdlManage(unittest.TestCase):
    """cnkdl系统后台--账号部分"""

    def utify_get_token(self):
        """
        统一登录接口获取token值
        :return: -->token
        """
        url = Utils.get_base_url() + "system/pc/api/sys/user/login"
        request_params = {
            "userName": "xxxxxrong",
            "password": "123456",
            "ip": "127.0.0.0",
            "loginName": "xxxxxrong",
            "loginPassword": "123456"
        }
        request_data = requests.post(url=url, json=request_params)
        logger.info("登录接口的入参:" + str(request_params))
        response_data = request_data.json()
        logger.info("登录接口的出参:" + str(response_data))
        if response_data["code"] == 200:
            logger.info("登录成功,获取到token")
            print(response_data["data"]["token"])
            return response_data["data"]["token"]
        else:
            logger.error("登录失败,获取不到token")

    # @unittest.skip
    def test_1_new_account(self):
        """
        新增账号接口
        :return:
        """
        i = 1
        while i <= 5:
            url = Utils.get_base_url() + "system/pc/sys/user/save"
            request_params = {
                "nickname": Configure.user_name + str(random.randint(1, 1000)),
                "loginName": Configure.user_name + str(random.randint(1, 1000)),
                "loginPassword": "123456",
                "confirmPassword": "123456",
                "gmtExpires": "2023-07-31 00:00:00",
                "remark": ""
            }
            request_headers = {"token": self.utify_get_token()}
            logger.info("新增账号接口入参:" + str(request_params))
            request_data = requests.post(url=url, json=request_params, headers=request_headers)
            response_data = request_data.json()
            logger.info("新增账号接口出参:" + str(response_data))
            if response_data["data"] == "添加成功":
                logger.info("新增账号接口执行成功")
            else:
                logger.error("新增账号接口执行失败")
            # self.assertEqual(200, response_data["code"], "新增账号接口执行成功")
            i += 1

    def test_2_research_account(self):
        """
        查询账号
        :return: -->listss
        """
        url = Utils.get_base_url() + "system/pc/sys/user/list"
        CnkdlManage().test_1_new_account()
        request_params = {"pageCurrent": 1, "pageSize": 200, "nickname": Configure.user_name}
        request_headers = {"token": self.utify_get_token()}
        request_data = requests.post(url=url, json=request_params, headers=request_headers)
        response_data = request_data.json()
        logger.info("查询用户接口返数据:" + str(response_data))
        lists = response_data["data"]["list"]
        listss = []
        for a in lists:
            listss.append(a["id"])
        # print(listss[0])
        return listss

    # @unittest.skip
    def test_3_allocation(self):
        """设置权限"""
        list2 = CnkdlManage().test_2_research_account()
        for i in list2:
            url = Utils.get_base_url() + "system/pc/sys/user/allocation"
            request_params = {"id": i, "roleIdList": ["1"]}
            request_headers = {"token": self.utify_get_token()}
            request_data = requests.post(url=url, json=request_params, headers=request_headers)
            logger.info("设置权限接口入参:" + str(request_params))
            response_data = request_data.json()
            logger.info("设置权限接口出参:" + str(response_data))
            self.assertEqual(200, response_data["code"], "设置权限成功")

    def test_4_delete_account(self):
        """删除账号"""
        time.sleep(5)
        list2 = CnkdlManage().test_2_research_account()
        for i in list2:
            url = Utils.get_base_url() + "system/pc/sys/user/delete"
            request_params = {"id": i}
            request_headers = {"token": self.utify_get_token()}
            logger.info("删除接口入参:" + str(request_params))
            request_data = requests.delete(url=url, data=request_params, headers=request_headers)
            response_data = request_data.json()
            logger.info("删除接口出参:" + str(response_data))
            self.assertEqual("删除成功", response_data["data"], "删除接口执行成功")

5、 在runTest.py 文件里设置入口,并且将测试报告发出去

import unittest
from tools.utils import Utils

if name == ‘main‘:
“””整个项目的入口”””

# 测试套件
test_suite = unittest.defaultTestLoader.discover("./testCase", pattern="test*.py")
# 生成报告 文件
report_dir = Utils.get_report_name(test_suite)
# 发送报告邮件
to_user = "xxxx_111@163.com", "xxxxxx841@qq.com"
subject = "cnkdl系统 的接口测试报告"
contents = ["你好,", "报告在附件里", "请注意查收"]
result = Utils.auto_send_email(to_user, subject, contents, report_dir)

6 、运行runTest文件,最终对应的邮箱会收到测试报告

92°/926 人阅读/0 条评论 发表评论

登录 后发表评论