前言
一直想学习自动化测试,但是都没行动,业余时间学习零零碎碎并记录20210418。
5、使用unittest框架
unittest框架简介
unittest中类方法和实例方法
测试用例和测试套件
使用unittest重构测试用例
为项目生产测试报告
unittest框架简介:测试用例,测试套件,测试运行器,测试加载器
一、什么是unittest
1、unittest是Python单元测试框架,类似于JUnit框架。
2、unittest中有5个重要的概念:test fixture, test case,tesloader, test suite, test runner
- Testcase:一个TestCase的实例就是一个测试用例。什么是测试用例呢?就是一个完整的测试流程,包括测试前准备环境的搭建(setUp),执行测试代码 (run),以及测试后环境的还原(tearDown)。元测试(unit test)的本质也就在这里,一个测试用例是一个完整的测试单元,通过运行这个测试单元,可以对某一个问题进行验证。
- Test suite:多个测试用例集合在一起,就是TestSuite,而且TestSuite也可以嵌套TestSuite。
- Testloader:是用来加载TestCase到TestSuite中的,其中有几个loadTestsFrom__()方法,就是从各个地方寻找TestCase,创建它们的实例,然后add到TestSuite中,再返回一个TestSuite实例。
- Test runner:是来执行测试用例的,其中的run(test)会执行TestSuite/TestCase中的run(result)方法。
- Test fixture:对一个测试用例环境的搭建和销毁,是一个fixture,通过覆盖 TestCase的setUp()和tearDown()方法来实现。这个有什么用呢?比如说在这个测试用例中需要访问数据库,那么可以在setUp() 中建立数据库连接以及进行一些初始化,在tearDown()中清除在数据库中产生的数据,然后关闭连接。注意tearDown的过程很重要,要为以后的 TestCase留下一个干净的环境。关于fixture,还有一个专门的库函数叫做fixtures,功能更加强大。
二、使用unittest编写python的单元测试代码,包括如下几个步骤:
- 1、编写一个python类,继承 unittest模块中的TestCase类,这就是一个测试类。
- 2、在上面编写的测试类中定义测试方法(这个就是指的测试用例),每个方法的方法名要求以 test 打头,没有额外的参数。 在该测试方法中 调用被测试代码,校验测试结果,TestCase类中提供了很多标准的校验方法,如 最常见的assertEqual。
- 3、执行 unittest.main() ,该函数会负责运行测试,它会实例化所有TestCase的子类,并运行其中所有以test打头的方法。
三、基本用法(unittest是python自带的一个单元测试框架,类似于java的junit,基本结构是类似的)
- 1.用import unittest导入unittest模块
- 2.定义一个继承自unittest.TestCase的测试用例类,如class xxx(unittest.TestCase):
- 3.定义setUp和tearDown,这两个方法与junit相同,即如果定义了则会在每个测试case执行前先执行setUp方法,执行完毕后执行tearDown方法。
- 4.定义测试用例,名字以test开头,unittest会自动将test开头的方法放入测试用例集中。
- 5.一个测试用例应该只测试一个方面,测试目的和测试内容应很明确。主要是调用assertEqual、assertRaises等断言方法判断程序执行结果和预期值是否相符。
- 6.调用unittest.main()启动测试
- 7.如果测试未通过,则会显示e,并给出具体的错误(此处为程序问题导致)。如果测试失败则显示为f,测试通过为.,如有多个testcase,则结果依次显示。
四、unittest模块的常用方法/TestCase类常用属性
方法 | 描述 |
setUp() | 用于测试用例执行前的初始化工作。如测试用例需要访问数据库,可以在setUp()中建立数据库连接并初始化,需要登录web,可以先实例化浏览器等。 |
tearDown() | 用于测试用例执行之后的善后工作,比如关闭数据库连接,关闭浏览器等。 |
assertEqual(a, b, [msg=测试失败时打印的信息]) | 断言a,b两个值是否相等,相等则测试通过。msg为可选参数,用于失败时打印信息 |
assertNotEqual(a, b, [msg]) | 断言a,b两个值是否相等,不相等则测试通过. |
assertTrue(x, [msg]) | 断言x是否True,true则测试通过 |
assertFalse(x, [msg]) | 断言x是否False,False则测试通过 |
assertIs(a, b, [msg]) | 断言a是否是b,是则测试通过 |
assertNotIs(a, b, [msg]) | 断言a是否是b,不是则测试通过 |
assertIsNone(x, [msg]) | 断言x是否是None,是None则测试通过 |
assertIsNotNone(x, [msg]) | 断言x是否是None,是None则测试通过 |
assertIn(a, b, [msg]) | 断言a是否在b中,是则测试通过 |
assertNotIn(a, b, [msg]) | 断言a是否在b中,不在则测试通过 |
assertIsInstance(a, b, [msg]) | 断言a是否是b的一个实例,是则测试通过 |
assertNotIsInstance(a, b, [msg]) | 断言a是否是b的一个实例,不是则测试通过 |
五、实例运用方法
- 1、打开python,在testcase下新建一个名为unittert的python-package文件。如下图所示:
- 2、新建test01.py
import unittest
# 需要调用unittest下面的TestCase方法
# 注意方法名必须是test开头
class MyTestCase(unittest.TestCase):
# setup开始的准备工作
# tearDown:结束的收尾工作
def setUp(self) -> None:
print("setup....")
def test01(self):
print("test01")
#自带的断言 1+2=3
self.assertEqual(1+2,3)
def test02(self):
print("test02")
#自带的断言5>=4
self.assertGreater(5,4)
def aaa(self): # 这个方法有问题,方法名必须是test开头
print("aaa")
def tearDown(self) -> None:
print("teaarDown....")
# 先用一个简单的方法来运行
if __name__ == '__main__':
unittest.main()
- 3、运行结果如下:
大家可以动手试试其他的方法~