测试框架-unittest-简介、基本概念、基本示例

2022-07-25 14:16:44 浏览数 (1)

简介、基本概念、基本示例

1、简介

unittest是Python自带的一个单元测试框架,unittest又被称为PyUnit,是由Java的JUnit衍生而来,基本结构是类似的。对于单元测试,需要设置预先条件,对比预期结果和实际结果。

由于unittest是Python自带的标准模块,所以不需要单独再去安装。引入包import unittest即可使用。

2、基本概念

1、unittest核心的四个概念:

test fixture:一般用于准备及清理工作。

test case:通常是使用assert方法检查动作和输入的响应,一般是基于TestCase类扩充。

test suite:多个测试的集合。

test runner:测试执行。

2、unittest.TestCase:TestCase类,所有测试用例类继承的基本类。

例如:

代码语言:javascript复制
class TestDemo(unittest.TestCase):

3、setUpClass():必须使用@classmethod装饰器,所有test运行前执行一次。

例如:

代码语言:javascript复制
@classmethod
    def setUpClass(cls):
        print('setUpClass')

4、tearDownClass():必须使用@classmethod装饰器,所有test运行完后执行一次。

例如:

代码语言:javascript复制
@classmethod
    def tearDownClass(cls):
        print('tearDownClass')

5、setup():每个测试方法运行前执行。

例如:

代码语言:javascript复制
def setUp(self):
        print('setUp')

6、teardown():每个测试方法运行完后执行。

例如:

代码语言:javascript复制
def tearDown(self):
        print('tearDown')

7、每个测试方法均以test开头,否则是不被unittest识别的。

例如:

代码语言:javascript复制
def test_case1(self):
        print('test_case1')

8、unittest.main():将一个单元测试模块变为可直接运行的测试脚本,main()方法使用TestLoader类来搜索所有包含在该模块中以test命名开头的测试方法,并自动执行他们。执行方法的默认顺序是:根据ASCII码的顺序加载测试用例,数字与字母的顺序为:0-9,A-Z,a-z。所以以A开头的测试用例方法会优先执行,以a开头会后执行。

9、unittest.TestSuite():创建测试套件。addTest()/addTests()方法是将测试用例添加到测试套件中。

例如:将test_Demo1模块下的TestDemo1类下的test_case1测试用例添加到测试套件中。

代码语言:javascript复制
suite = unittest.TestSuite()
suite.addTest(test_Demo1.TestDemo1('test_case1'))

10、unittest.TestLoader():根据不同的条件加载测试用例,其中有几个方法:

代码语言:javascript复制
unittest.TestLoader().loadTestsFromName()
unittest.TestLoader().loadTestsFromNames()
unittest.TestLoader().loadTestsFromTestCase()
unittest.TestLoader().loadTestsFromModule()
unittest.TestLoader().discover()

例如:将test_case包下的test_Demo1模块下的TestDemo1类下的test_case1测试用例添加到测试套件中。

代码语言:javascript复制
suite = unittest.TestSuite()
suite.addTests(unittest.TestLoader().loadTestsFromName('test_case.test_Demo1.TestDemo1.test_case1'))

11、unittest.defaultTestLoader():通过该类下面的discover()方法可自动根据测试目录test_dir匹配查找测试用例文件(test*.py),并将查找到的测试用例组装到测试套件中。

例如:

代码语言:javascript复制
discover=unittest.defaultTestLoader.discover(test_dir, pattern='test_*.py')

12、unittest.TextTextRunner():通过该类下面的run()方法来运行suite所组装的测试用例,入参为suite测试套件。

例如:

代码语言:javascript复制
suite = unittest.TestSuite()
suite.addTest(TestDemo('test_case1'))
runner = unittest.TextTestRunner()
runner.run(suite)

3、基本示例

1、创建test_Demo.py文件。

创建TestDemo类,并继承unittest.TestCase;创建setUpClass、tearDownClass、setUp、tearDown;之后创建多个以test开头的测试方法,每个这样的方法在load的时候便会生成一个TestCase实例,如TestDemo类中有3个test_xxx方法,最后在load到suite中便有3个测试用例。

脚本代码:

代码语言:javascript复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 导入unittest模块
import unittest
"""
基本示例
"""
# 定义测试类,父类为unittest.TestCase
class TestDemo(unittest.TestCase):

    # 必须使用@classmethod装饰器,所有test运行前执行一次
    @classmethod
    def setUpClass(cls):
        print('setUpClass')

    # 必须使用@classmethod装饰器,所有test运行完后执行一次
    @classmethod
    def tearDownClass(cls):
        print('tearDownClass')

    # 每个测试方法运行前执行
    def setUp(self):
        print('setUp')

    # 每个测试方法运行完后执行
    def tearDown(self):
        print('tearDown')

    # 所有的测试方法都要以test为开头
    def test_case1(self):
        print('test_case1')

    def test_case2(self):
        print('test_case2')

    def test_case3(self):
        print('test_case3')

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

2、执行test_Demo.py文件,运行结果:

setUpClass()最先执行;

tearDownClass()最后执行;

setup()每个测试方法运行前执行;

teardown()每个测试方法运行完后执行;

3个测试方法(test_case1、test_case2、test_case3)。

最后打印出的3个点为3个测试方法执行结果标识:

成功是 .

失败是 F

出错是 E

跳过是 S

3、在unittest.main()中加verbosity参数可以控制输出报告的详细程度,默认是1。

verbosity=0 是简单报告;

verbosity=1 是一般报告;

verbosity=2 是详细报告。

将test_Demo.py文件里的unittest.main()修改为unittest.main(verbosity=2),再次执行脚本。

运行结果:执行后输出的详细报告信息。

0 人点赞