当前位置:网站首页>unittest框架

unittest框架

2022-08-02 14:15:00 keer丶

unittest 基本使用

  • unittest框架

    是python自带的一个单元测试框架,不需要单独安装。
  • 使用的原因

    1.能够组织多个用例去执行
    2.提供丰富的断言方法
    3.能够生成测试报告
  • 核心要素

    1.TestCase--测试用例,是unittest的组成部分,是用来书写真正的用例代码
    2.TestSuite--测试套件,是用来组装TestCase的,可以将多个用例脚本文件组装到一起
    3.TestRunner--测试执行,是用来执行TestSuite的
    4.TestLoader--测试加载,是对TestSuite功能的补充
    5.Fixture--测试夹具,是一种代码结构,书写前置方法和后置方法的代码

TestCase测试用例

  • 步骤

    1.导包 unittest
    2.定义测试类
    3.书写测试方法
    4.执行:鼠标放在类名后边右键运行,运行该类所有的测试用例,放在类下的方法名后边,只运行该方法。
  • 注意事项

    1.代码文件名字要满足标识符的规则
    2.代码文件名不要使用中文
  • 实例

    import unittest
    # 2.定义测试类
    class TestDemo(unittest.TestCase):
    # 3.书写测试方法
        def test001_demo(self):
            print('测试方法1')
        def test002_demo(self):
            print('测试方法2')
    # 4.执行
    # 4.1在类名或方法名后边运行,鼠标放在类名后边右键运行,运行该类所有的测试用例,放在类下的方法名后边,只运行该方法。
    # 4.2使用unittest.main运行
    if __name__ == '__main__':
        unittest.main()
  • 常见错误

    1.py文件名字带中文,需要将文件名改为英文下划线等。
    2.右键没有unittest for 运行

####

TestSuite和TestRunner

  • testsuite(测试套件)

将多条用例脚本集合在一起,就是套件,即用来组装用例的
1.导包 unittest
2.实例化套件对象 unittest.TestSuite()
3.添加用例方法
  • TestRunner

用来执行套件对象的
1.导包 unittest
2.实例化执行对象 unittest.textTestRunner()
3.执行对象去执行套件对象
  • 整体步骤

1.导包 unittest
2.实例化套件对象 suite = unittest.TestSuite()
3.添加用例方法
3.1 suite.addTest(用例类名('用例方法名')) --一次性只能添加一个方法
3.2 suite.addTest(unittest.makeSuite(用例类名)) ----一次性只能添加一个类
4.实例化执行对象 runner = unittest.textTestRunner()
5.执行对象去执行套件对象 runner.run(suite)
  • 代码案例

    # 1.导包 unittest
    import unittest
    # 2.定义测试类
    class TestDemo1(unittest.TestCase):
    # 3.书写测试方法
        def test001_demo(self):
            print('测试方法1-1')
        def test002_demo(self):
            print('测试方法1-2')

    # 1.导包 unittest
    import unittest
    from test_unittest.test_testcase1 import TestDemo1 #另外一个测试用例文件中的类
    from test_unittest.test_testcase2 import TestDemo2 #另外一个测试用例文件中的类
    ​
    # 2.实例化套件对象 unittest.TestSuite()
    suite = unittest.TestSuite()
    ​
    # 3.添加用例方法
    #3.1
    #suite.addTest(TestDemo1('test001_demo')) #此种方式为单个添加,格式:类名('方法名')
    #suite.addTest(TestDemo1('test002_demo'))
    #suite.addTest(TestDemo2('test001_demo'))
    #suite.addTest(TestDemo2('test002_demo'))
    ​
    # 3.2添加整个测试类
    suite.addTest(unittest.makeSuite(TestDemo1))
    suite.addTest(unittest.makeSuite(TestDemo2))
    ​
    # 4.实例化执行对象 unittest.textTestRunner()
    runner = unittest.TextTestRunner()
    ​
    # 5.执行对象去执行套件对象
    runner.run(suite)

####

TestLoader测试加载

作用和TestSuite一样,组装用例代码,同样也需要TestRunner()去执行

1.导包  unittest
2.实例化加载对象并加载用例 --->得到的是 套件对象
3.实例化执行对象并执行
  • 代码示例

    # 1.导包  unittest
    import unittest
    ​
    # 2.实例化加载对象并加载用例 --->得到的是 套件对象
    suite = unittest.TestLoader().discover(r'./','test_testcase*.py')
    ​
    #3.实例化执行对象并执行
    runner = unittest.TextTestRunner()
    runner.run(suite)

Fixture

是一种在用例执行前后会自动执行的代码结构

  • 方法级别的fixture

在每个用例执行前后都会自动调用,方法名是固定的
def setUp(self):  #前置,每个用例执行前都会自动调用
    方法体
    
def tearDown(self):  #后置,每个用例执行后都会自动调用
    方法体
  • 类级别的fixture

在类中所有的测试方法执行前后,自动执行一次
@classmethod
def setUpClass(cls):  #前置
    方法体
    
def tearDownClass(cls):  #后置
    方法体
  • 模块级别的fixture(了解)

模块就是整个代码文件
模块级别,在这个代码文件执行前后执行一次
#在类外部定义
def setUpModule():
    pass
def tearDownModule():
    pass

断言

让程序代替认为判断测试程序执行结果是否符合预期结果的过程
序号断言方法断言描述
1assertEqual(expected,actual,msg=None)验证expected==actual,不等则fail
2assertIn(member,container,msg=None)验证是否member in container

参数化

安装parameterized :pip install parameterized

--通过参数的方式来传递数据,从而实现数据和脚本分离,可以实现用例的重复执行,unittest本身不知处参数化,需要通过安装扩展插件parameterized来实现。

1.导包:from parameterized import parameterized
2.定义测试方法,将测试方法中的测试数据使用变量表示
3.组织测试数据格式,[(),(),()],一个元组就是一组数据
4.参数化,在测试方法上使用装饰器@parameterized.expend(测试数据)
5.运行代码
from parameterized import parameterized
import  unittest   
from test_unittest.util import add  #导入add方法,就是简单的加法
​
data=[(1,1,2),(1,2,3),(2,3,5),(1,1,3)]  #数据在一个文件内
class TestAdd(unittest.TestCase):
    @parameterized.expand(data)
    def test_add(self,a,b,expect):
        self.assertEqual(expect,add(a,b))
​
suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(TestAdd))
​
runner = unittest.TextTestRunner()
runner.run(suite)
  • 数据在json文件内

    # json文件 testdata.json
    [
      {"a":1,"b":2,"expect":3},
      {"a":1,"b":3,"expect":4},
      {"a":1,"b":2,"expect":3},
      {"a":1,"b":2,"expect":5},
      {"a":2,"b":2,"expect":4}
    ]
    #工具文件 util.py
    import json
    #加法方法
    def add(a,b):
        return a+b
    #读取json文件,转换成[(1,1,2),(),()]格式
    def load_data():
        with open(r'testdata.json','r',encoding='utf-8') as f:
            data_list = json.load(f)  #读取文件并转成[{"k":"v"},{"k":"v"}]
            test_data = []
            for item in data_list:
                a = item.get('a')
                b = item.get('b')
                expect = item.get('expect')
                test_data.append((a,b,expect))  #(a,b,expect)=====>(1,2,3)
            return test_data
from parameterized import parameterized  #导入parameterized
import  unittest #导入unittest
from test_unittest.util import add, load_data #导入util中的方法
​
​
class TestAdd(unittest.TestCase):
    @parameterized.expand(load_data())
    def test_add(self,a,b,expect):
        self.assertEqual(expect,add(a,b))
​
suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(TestAdd))
​
runner = unittest.TextTestRunner()
runner.run(suite)

测试报告

HTML测试报告:就是执行完测试用例后,以HTML方式将执行结果生成报告,本质是TestRunner

使用HTMLTestReport --安装 pip install HTMLTestReport

1.导包  unittest   HTMLTestReport  --- from htmltestreport import HTMLTestReport
2.组装用例(套件or TestLoader)
3.使用HTMLTestReport 中的runner执行套件
4.查看报告
from parameterized import parameterized
import  unittest
from test_unittest.util import add, load_data
from htmltestreport import HTMLTestReport
​
​
class TestAdd(unittest.TestCase):
    @parameterized.expand(load_data())
    def test_add(self,a,b,expect):
        self.assertEqual(expect,add(a,b))
​
suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(TestAdd))
​
runner = HTMLTestReport(r'./report.html','测试用例报告','这里是一个描述')
runner.run(suite)
原网站

版权声明
本文为[keer丶]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_46118737/article/details/126025843