unittest notes
what is unittest?
unittest 是python单元测试框架,类似于JUnit框架
4 important concepts
test fixture(测试脚手架):对一个测试用例环境的搭建和销毁,是一个fixture,通过覆盖 TestCase的setUp()和tearDown()方法来实现。比如说在这个测试用例中需要访问数据库,那么可以在setUp() 中建立数据库连接以及进行一些初始化,在tearDown()中清除在数据库中产生的数据,然后关闭连接。为以后的 TestCase留下一个干净的环境。
test case(测试用例):一个TestCase的实例就是一个测试用例。是一个完整的测试流程,包括测试前准备环境的搭建(setUp),执行测试代码 (run),以及测试后环境的还原(tearDown)
test suite(测试集):就是一组测试用例
test runner(测试运行器):test runner 是一个用于执行和输出测试结果的组件。这个运行器可能使用图形接口、文本接口,或返回一个特定的值表示运行测试的结果。
easy demo
1.用import unittest导入unittest模块
2.定义一个继承自unittest.TestCase的测试用例类,如class xxx(unittest.TestCase):
3.定义setUp和tearDown,即如果定义了则会在每个测试case执行前先执行setUp方法,执行完毕后执行tearDown方法。
4.定义测试用例,名字以test开头,unittest会自动将test开头的方法放入测试用例集中。注意:定义的用例只能用test开头,否则无法识别,而且用例执行的顺序按照字母和数字大小顺序排序,如test_99 在test_100之前执行
pycharm中也可以通过点击单个用例边上的绿色三角形按钮执行单个用例
assert
实际使用经常用断言(assert)判断用例执行结果和预期的是否相符,如果不符合就给出错误提示
常用断言
1.assertEqual(self, first, second, msg=None)
–判断两个参数相等:first == second
2.assertNotEqual(self, first, second, msg=None)
–判断两个参数不相等:first != second
3.assertIn(self, member, container, msg=None)
–判断是字符串是否包含:member in container
4.assertNotIn(self, member, container, msg=None)
–判断是字符串是否不包含:member not in container
5.assertTrue(self, expr, msg=None)
–判断是否为真:expr is True
6.assertFalse(self, expr, msg=None)
–判断是否为假:expr is False
7.assertIsNone(self, obj, msg=None)
–判断是否为None:obj is None
8.assertIsNotNone(self, obj, msg=None)
–判断是否不为None:obj is not None
DDT
DDT(data drive test)即数据驱动测试,ddt有什么用?我们为什么要ddt?数据驱动简单说就是对用例进行参数化,试想一下,我们在测试输入框时,要输入多个数据,难道要创建多个用例吗?然后在每个用例中设置不同数据?这样做不仅费时而且代码重复低效,unittest中提供了DDT模块,用一组数据对应一个测试用例,自动执行生成所有用例
install
pip install ddt
easy demo
1.从ddt中导入ddt和data
2.在类前加修饰@ddt
3.在用例前加修饰@data() ------括号中为数据
示例中给出了3个数据,然后用例中判断是否和a相等
结果:生成了3个测试用例,第一个相等,其他两个不相等
如果想传入多个参数,可以用@unpack对数据进行解包
如上图,实现了将(‘b’,‘b’)中第一个传给a,第二个传给b,执行第一个用例,相等通过;将(‘b’,‘bb’)中第一个传给a,第二个传给b,执行第二个用例,不相等
如果不进行解包,第一次执行则将(‘b’,‘b’)作为整体传递给a,没有对b进行传参
如果数据很多,建议以字典索引方式取值
如图,*以实参方式传递,作用是将可迭代序列拆开,本代码中是将元组中列表拆开传给a。如果不加 * 则将整个元组传给a
choose designative test case
unittest的四个重要概念中,上文提及了两个,还有test suite 和test runner有什么用?他们可以用来指定要运行的用例
在前面我们都是通过unittest.main()运行程序,实现运行所有的用例,但如果我们想指定运行哪些用例,就可以用suite和runner
添加了test_2:
未添加test_2:
trap notice
用suite这个地方有好几个坑
1.如果用pycharm,运行时不要点左边的按钮,要注意运行整个py文件,否则可能会执行全部用例
2.当用ddt方法时,运行文件可能会报找不到该用例的错误,原因是用ddt方法后,用例的名字改变了
需要将用例名称改成新的名称
unittest.TestLoader().getTestCaseNames() 可以查看所有用例名