首先来大概了解一下pytest一些好处啊,就为什么我们要选择pytest来做而不是unittest
简单灵活,容易上手;
支持参数化;【当然unittest其实也支持参数化,只不过方式不如pytest灵活】
能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium、接口自动化测试);
pytest具有很多第三方插件,并且可以自定义扩展,比较好用的如pytest-selenium、pytest-html、pytest-rerunfailures(;
可以很好的和jenkins集成;
report框架allure 也支持了pytest;当然这跟地方可以用其他的第三方的报告哈;比如柠檬班木森老师的 unittestreport;也是可以支持pytest的哈。
啥也别说了,这么好用,直接去搞起来
安装一下
pip install pytest 搞定
不放心就验证一下
pytest --version
测试用例
那首先我们要去收集测试用例对吧,在pytest里面,需要按照它规定的格式去写用例的类、函数名,所有的单测文件名都需要满足test_.py格式或_test.py格式。测试类以Test开头,并且不能带有 init 方法(注意:定义class时,需要以T开头,不然pytest是不会去运行该class的)
在单测类中,可以包含一个或多个test_开头的函数。
此时,在执行pytest命令时,会自动从当前目录及子目录中寻找符合上述约束的测试函数来执行。
Fixture夹具的使用
text Fixture函数的目的是为测试的重复执行提供一个可靠的固定基线。Fixture函数比经典的xUnit setUp/tearDown方法有着显着的改进:
Fixture函数具有明确的名称,在测试用例/类/模块或整个项目中通过声明使用的Fixture函数名称来使用。 Fixture函数以模块化方式实现,因为每个Fixture名称都会触发调用Fixture函数,该fixture函数本身可以使用其它的Fixture函数。 从简单的单元测试到复杂的函数测试,Fixture函数的管理允许根据配置和组件选项对Fixture函数和测试用例进行参数化,或者在测试用例/类/模块或整个测试会话范围内重复使用该Fixture函数。 它还可以作为函数参数来使用 测试用例可以通过在其参数中使用Fixture函数名称来接收Fixture函数。 每个fixture参数名称所对应的函数,可以通过使用@pytest.fixture注册成为一个fixture函数,来为测试用例提供一个Fixture函数。 让我们看一个只包含一个fixture和一个使用它的测试用例的简单独立测试模块:
import pytest @pytest.fixture def smtp_connection(): import smtplib return smtplib.SMTP("smtp.gmail.com",587,timeout=5)
def test_ehlo(smtp_connection): response,msg = smtp_connection.ehlo() assert response == 200 另外夹具提供的优先级执行,按照会话、模块、类、函数等级别划分 当fixture超出范围时,通过使用yield语句而不是return,pytest支持fixture执行特定的teardown代码。yield语句之后的所有代码都视为teardown代码: import smtplib import pytest
@pytest.fixture(scope="class") def smtp_connection(): smtp_connection = smtplib.SMTP("smtp.gmail.com",587,timeout=5) yield smtp_connection # provide the fixture value print("teardown smtp") smtp_connection.close() scope参数就规定了优化及以类优先。 当我们使用了这个参数之后,我们脚本就会按照我们设置的优先级去执行及脚本,执行完成之后会再次回调teardown当然它还支持对用例进行标记,效果与pytest.mark.parametrize一样。 skip跳过测试用例 版本2.9中的新函数。 跳过测试用例的最简单方法是使用skip装饰器标记它,可以传递一个可选的原因reason参数: @pytest.mark.skip(reason="目前没办法测试该用例") def test_the_unknown(): 或者,也可以在测试执行或setup期间,通过调用pytest.skip(reason)函数强制跳过该用例: def test_function(): if not valid_config(): pytest.skip("不支持该配置") 当在导入时间内无法评估跳过条件时,这种在用例跳过的方法非常有用。
也可以在模块级别跳过整个模块:pytest.skip(reason,allow_module_level=True)
import sys import pytest if not sys.platform.startswith("win"): pytest.skip("跳过只支持Windows平台的用意",allow_module_level=True)
然后就是有失败重运行机制,今天先写到这里,下次我们重点细讲一下参数化。