当前位置: 首页 > 后端技术 > Python

几分钟后,开始使用Python单元测试框架Pytest

时间:2023-03-26 10:50:16 Python

1。Pytest入门1.1入门1.1.1运行测试用例理论都是为实战准备的。写一个简单的测试用例,文件名为“test_sample.py”#pytesttest_sample.pydefinc(x):returnx+1deftest_answer():assertinc(3)==5这两个方法很简单,test_answer()断言目标函数inc;-pytesttest_sample.py运行测试用例我们看一下运行结果,测试结果显示已经运行了一个测试用例,结果为红色,表示失败。错误消息显示代码的第7行抛出了AssertionError。您可以更改代码以使测试用例通过绿色。本次测试用例涉及pytest的3条简单规则:测试模块以test_前缀命名——测试用例(函数)也以test_前缀命名——使用assert断言1.1.2判断结果。异常处理捕获异常,并进行异常处理,是每段代码中的必要条件。当然pytest也支持异常捕获。方法是:使用with+pytest.raises捕获目标函数的异常:#-*-coding:utf-8-*-#@Time:2021-09-05#@Author:Carl_DJimportpytestdeff():raiseSystemExit(1)deftest_mytest():#catchexceptionwithpytest.raises(SystemExit):f()1.1.3测试类当然pytest也支持测试类,测试类的作用:用于测试和分组#-*-编码:utf-8-*-#@Time:2021-09-05#@Author:Carl_DJclassTestClass:#test_beginningdeftest_one(self):x="this"assert"h"inx#beginningoftest_deftest_two(self):x="hello"asserthasattr(x,"check")这里,都是以test_开头,同unittest。如果不是以test_开头,则无法调用。1.1.4自动运行测试脚本如果一个suit文件夹有多个测试用例脚本,我们只需要进入一个pytest就可以运行所有的测试脚本。如下图所示,这就是惰性模式。1.2进阶技巧1.2.1parametrize俗话说,代码没有参数,两行改参数!所以,在可以参数化的时候,尽量参数化,不管重构难不难。我们先看看parametrize的用法,如下:在测试用例前面加上:@pytest.mark.parametrize("parametername",listdata)参数名:用来接收每一项数据,作为参数对于测试用例。列表数据:一组测试数据。不加参数看例子,看测试用例怎么写deftest_eval():asserteval("3+5")==8asserteval("'2'+'4'")=="24"asserteval("6*9")==54看起来很麻烦,我们用parametrize优化一下看看是不是简洁了很多[("3+5",8),("'2'+'4'","24"),("6*9",54)])deftest_eval_1(test_input,expected):asserteval(test_input)==expected看了这段代码,非常简洁。让我们看看参数化是做什么的。首先调整测试函数的参数作为输入和期望;-然后在parametrize中填写参数值;-函数参数分配将在运行时自动执行。这样,添加测试条件,不需要改变test_eval_1的函数体,只需要添加条件数组即可。1.2.2.markmark是一个标签,标记哪些测试用例被执行,哪些没有被执行。#label@pytest.mark.slowdeftest_mark():print("testmark")#模拟运行耗时测试用例time.sleep(10)assert5==5然后添加pytest.ini文件到pytestConfigure:[pytest]markers=slow:将测试标记为慢速(用'-m"notslow"'取消选择)使用以下命令跳过标记的函数并加速测试:pytesttest_sample.py-m"notslow"你也可以只运行标记的函数pytest-mslow1.2.3fixturefixture类似于unittest的setup/teardown,但是功能比这个更强大。例如#-*-coding:utf-8-*-#@Time:2021-09-05#@Author:Carl_DJimportpytest#Setfixture@pytest.fixturedeffirst_entry():return"a"#Setfixture@pytest。fixturedefsecond_entry():return2#Setfixture@pytest.fixturedeforder(first_entry,second_entry):return[first_entry,second_entry]#Setfixture@pytest.fixturedefexpected_list():返回["a",0def2,test_string(order,expected_list):order.append(3.0)#断言assertorder==expected_list当然fixture也可以嵌套,order嵌套first_entry和second_entry。测试写数据库的用例需要连接数据库,那怎么办呢?这并不难,夹具也能搞定。在测试用例目录下写conftest.py@pytest.fixturedefdatabase_connection():#coding......1.2.4plugin&&hook可以写pytestplugin插件和hook来扩展pytest。先创建目录a,然后在目录a下创建conftest.py和test_sub.py两个文件。#在目录a中创建conftest.pydefpytest_runtest_setup(item):#在目录a中运行每个用例print("settingup",item)#在目录a中创建test_sub.pydeftest_sub():passusepytesta/test_sub.py--capture=no会加载我们写的plugging和hook,在console中可以看到如下字样:...a/test_sub.pysettingupsetup中类似的功能。2.小??结以上是pytest一些常用功能的小结,是不是也很简单呢?让我们回顾一下今天所学的内容!test目录一般以与src同级的测试命名-测试模块使用test_前缀-测试类使用Test前缀,无需继承其他父类-测试用例也使用test_前缀-可以使用parametrize进行参数化-可以使用mark进行测试用例标注-可以使用fixture模拟测试条件-使用pytest.ini文件配置pytest-可以编写插件和hoo来扩展pytest更多关于pytest的信息可以继续付费注意,或者你可以阅读官方文档。以上就是本次分享的全部内容。觉得文章还不错的话,请关注公众号:Python编程学习圈,每日干货分享,发送“J”还能领取大量学习资料。或者去编程学习网了解更多编程技术知识。