pytest是基于Python语言的单元测试框架,也是一个命令行工具,可以自动找到测试用例执行并反馈测试结果,在编写测试用例方面比较自由,可以使用函数式的编程方式编写测试用例,也可以使用面向对象的方式编写测试用例。pytest测试框架断言assert使用Python原生的断言方式,同时pytest测试框架可以完美地和UnitTest测试框架整合起来,并结合Allure框架生成测试报告。与UnitTest相比,pytest测试框架更加自由灵活,使用UnitTest测试框架时,首先需要继承TestCase类,而且必须使用面向对象的编程方式。pytest测试框架属于第三方库,安装成功后,直接编写函数或者编写测试方法就可以使用。UnitTest测试框架与pytest测试框架的区别如表1-1所示。
表 1-1 UnitTest 测试框架与 Pytest 测试框架的区别
pytest是第三方库,需要单独进行安装,安装命令如下。
pip3 install pytest
安装成功后,可以直接使用。在pytest测试框架中,编写的测试方法(测试函数)必须以test开头,测试模块建议以“test_模块名称.py”的方式命名。pytest支持函数式的编程,也支持面向对象的编程,下面通过使用两种不同的编程方式编写测试用例来介绍pytest的基本使用。
编写一个两个数相加的函数,通过函数的方式编写针对该函数的测试用例,代码如下。
备注:
测试用例执行后就会显示执行后的测试结果。
在pytest测试框架中,使用面向对象方式编写测试用例,需要注意的是,类的首字母必须大写而且以Test开头,否则在测试类中编写的测试方法不会被搜索到,即无法执行。它的搜索规则为首先检查测试类是否满足pytest的规范,在测试类满足规范的基础上,再检查测试方法是否满足规范,如果测试方法满足pytest的规范,测试类不满足pytest的规范,那么测试类中的测试方法也就无法执行。代码如下。
在上述代码中,测试类并不是以Test开头的,所以执行代码后显示的测试用例执行数是0,执行结果如下。
collecting ... collected 0 items
把测试类从AddTest修改为TestAdd后,再次执行代码,就可以执行测试类中的测试方法了,修改后的代码如下。
执行结果如下。
collecting ... collected 1 item test_demo.py::TestAdd::test_add_int PASSED
在pytest测试框架中,执行测试模块中的测试方法后,会显示每个测试用例的执行结果信息,常用的结果信息如下。
PASSED:表示结果通过。
FAILED:表示结果失败。
SKIPPED:表示跳过执行。
XFAIL:表示预期失败。
执行结果中,会显示FAILED、PASSED、SKIPPED、XFAIL,执行代码时带上参数-v可以显示详细的过程。下面通过编写案例来介绍该过程,代码如下。
代码执行结果如下。