unittest05--测试固件

测试固件(Test Fixture)

    也称用例包裹方法
    测试固件是固定的测试代码,整合了代码的公共部分
    用于处理测试执行之前的准备工作和测试执行后的清理工作
    如果代码需要在整个模块之前做,可以使用setUpModule,把代码放到方法体中
    如果代码需要每个类之前做,可以使用setUpClass,把代码放到方法体中
    如果代码需要每个用例之前做,可以使用setUp,把代码放到方法体中

测试固件的分类

setUpModule() -- 初始化工作
    在执行模块中所有测试类之前执行且只执行一次的代码
    放在测试类的外边、前面
tearDownModule() -- 结束初始化工作
    在执行完模块中所有测试类之后执行且只执行一次的代码
    放在测试类的外边、前面
setUpClass(cls)
    在测试类加载时执行只执行一次
    用于实现测试前的初始化工作
    必须使用@classmethod修饰
    形参使用cls或self均可,默认cls,常用self
tearDownClass(cls)
    在测试类运行结束时执行只执行一次
    用于实现测试类执行完成时的清理工作
    必须使用@classmethod修饰
    形参使用cls或self均可,默认cls,常用self
setUp(self)
    用于实现每个测试方法执行前的准备工作
    每个测试方法执行前执行一次
    形参必须是self
tearDown(self)
    用于实现每个测试方法执行完毕后的清理工作
    每个测试方法执行完成后执行一次
    形参必须是self

测试固件的使用

"""
    测试固件的使用
"""
import unittest
class Ceshi(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        print('本类中所有测试用例执行前只做一次的代码setUpClass')
    def setUp(self) -> None:#-> None可以不写 表示返回值
        print('本类中每一个测试用例执行前先做的代码setUp')
    def tearDown(self) -> None:
        print('本类中每一个测试用例执行完后做的代码tearDown')
    @classmethod
    def tearDownClass(cls) -> None:
        print('本类中所有的测试用例执行完毕后才做一次的代码tearDownClass')
    def test1(self):#Ceshi类的成员方法,test开头叫做测试用例
        print('第一个测试用例test1')
    def test2(self):
        print('第二个测试用例test2')

# 执行测试
if __name__=='__main__':
    unittest.main()

调试project_M1

将login进行调试 加入测试固件

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


class Login(unittest.TestCase):
    @classmethod
    def setUpClass(self) -> None:
        # 数据库初始化
        db.DB().init_db(['login.sql'])
        # 读测试用例数据
        self.cases = casedata.read_cases('login.xlsx')  # 用例:用例名0、参数数据1、预期结果2
        # 读接口服务器地址
        host = serverconf.ServerConf().get_host()
        self.address = host + '/exam/login/'

    def test_login(self):
        """
        测试登录接口
        :return:
        """
        try:
            # 发送请求
            for case in self.cases:  # case代表一行用例
                case_name = case[0]  # 第0列,是用例名称
                argument = eval(case[1])  # 要发送的参数
                expect = case[2]  # 预期接口的返回结果
                postdata.post(self.address, argument, case_name, expect)
        except Exception as e:
            log.log().error('登录接口测试出错' + e)


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

调试project_M1

将signup进行调试 加入测试固件

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


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

    def test_signup(self):  # 必须test开头
        """
        测试注册接口
        :return:
        """
        try:
            # 发送请求
            for case in self.cases:
                case_name = case[0]  # 用例名称
                argument = eval(case[1])  # 参数
                expect = eval(case[2])  # 预期接口返回结果
                sql = case[3]  # 预期sql
                dbexpect = case[4]  # 预期数据库行数
                # 发送请求
                postdata.post(self.address, argument, case_name, expect)
                # 落库检查
                db.DB().check_db(case_name, sql, argument, dbexpect)
        except Exception as e:
            log.log().error('注册接口测试出错' + e)


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

posted @ 2021-11-07 18:52  暄总-tester  阅读(135)  评论(0)    收藏  举报