unittest11--运用DDT调试项目

调试project_M1

目的:运用ddt数据驱动模块调试完善exam项目测试脚本
调试postdata中的第十五行考虑数据类型转换

import requests
from project_M1.common import log


def post(address, argument, case_name, expect):
    """
    :param address: 接口地址
    :param argument: 请求参数
    :param case_name: 用例名称
    :param expect: 预期结果
    :return:
    """
    try:
        # 发送请求 判断响应结果的正确性
        res = requests.post(url=address, data=eval(argument))
        if 'text/html' in res.headers['Content-Type']:  # 表示响应内容的类型是字符串
            actual = res.text
            # 结果比对
            if expect in actual:
                log.log().info('比对登录接口返回==' + case_name + '==通过')
                return True
            else:
                log.log().warning('比对登录接口返回==' + case_name + '==失败==预期结果:' + expect + ',实际结果:' + actual)
                return False
        elif 'application/json' in res.headers['Content-Type']:
            actual = res.json()  # 实际结果(字典)
            # 比对接口返回结果
            if expect == actual:
                log.log().info("比对注册接口返回==" + case_name + '==通过')
                return True
            else:
                log.log().warning('比对注册接口返回==' + case_name + '==失败==预期结果:' + str(expect) + ',实际结果:' + str(actual))
                return False
        else:  # xml
            pass  # 暂时不写代码
    except Exception as e:
        log.log().error('发送数据,比对响应结果出错')


if __name__ == '__main__':
    post('http://192.168.139.137/exam/login/', {'username': 'admin', 'password': '123456'}, '成功登录测试', '登录成功')

使用DDT完成login代码

from project_M1.common import db, log, serverconf, casedata, postdata
import unittest
from ddt import ddt, data, unpack

# 读测试用例数据
cases = casedata.read_cases('login.xlsx')  # 用例:用例名0、参数数据1、预期结果2


@ddt
class Login(unittest.TestCase):#unittest.TestCase不可以省略
    @classmethod
    def setUpClass(self) -> None:# Login类中所有测试用例之前先做下面代码
        # 数据库初始化
        db.DB().init_db(['login.sql'])
        # 读接口服务器地址
        host = serverconf.ServerConf().get_host()
        self.address = host + '/exam/login/'

    @data(*cases)  # @data参数中不能使用self.、cls.
    # cases是二维列表,有多行多列,@data(*cases)意思是拆出多行用例,
    # 一行用例做一次循环,循环一次执行一次所修饰的test方法,
    # 假设cases中有5个子列表,可以理解为5行,就会循环执行test_login五次
    @unpack  # 对cases中的每一行中的列进行拆分
    def test_login(self, case_name, argument, expect):
        # self 不能省略 定义一个测试用例测试登录接口测试用例
        """
        测试登录接口
        :return:
        """
        result = postdata.post(self.address, argument, case_name, expect)
        self.assertTrue(result)


if __name__ == '__main__':  # 只有自己的文件才执行下面的代码,别人导入自己的文件后不执行
    unittest.main()  # 执行所有test开头的测试用例(类中的方法)

使用ddt完成signup代码

from project_M1.common import db, log, serverconf, casedata, postdata
import unittest
from ddt import ddt, data, unpack


@ddt
class Signup(unittest.TestCase):  # 测试用例类  测试类
    # 读注册接口测试用例:signup.xlsx
    cases = casedata.read_cases('signup.xlsx')

    @classmethod
    def setUpClass(self) -> None:
        # 数据库初始化(执行注册接口的初始化语句)
        db.DB().init_db(['signup.sql'])
        # 注册接口测试用例:signup.xlsx
        self.cases = casedata.read_cases('signup.xlsx')
        # 接口地址
        self.host = serverconf.ServerConf().get_host()
        self.address = self.host + '/exam/signup/'

    @data(*cases)  # 拆出行
    @unpack  # 拆出列
    def test_signup(self, case_name, argument, expect, expectsql, expect_db_rows):  # 必须test开头
        """
        测试注册接口
        :return:
        """
        result = postdata.post(self.address, argument, case_name, eval(expect))
        self.assertTrue(result)
        dbresult = db.DB().check_db(case_name, expectsql, argument, expect_db_rows)
        self.assertTrue(dbresult)


if __name__ == '__main__':
    unittest.main()

posted @ 2021-11-08 00:07  暄总-tester  阅读(123)  评论(0)    收藏  举报