1、安装
命令行pip install pytest
pycharm安装
下载pytest包,python setup.py install
2、start
先创建一个简单的用例:
def func(x):
return x + 1
def test_answer():
assert func(3) == 5
注意:用例的名字必须是test开头,如果写在类里面则需要类以Test开头命名:
查看下述代码运行结果说明上面的解释:
代码:
def func(x):
return x + 1
def testanswer():
assert func(3) == 4
def add_test():
assert 3-1==2
class A:
def test_div( self ):
assert 9/3==3
class TestA:
def test_x( self ):
assert 3*6==18
def ddf( self ):
assert 1==1
结果
C:\Users\18566\Desktop\APPAutoTest\pytest_leran>pytest -v
Test session starts (platform: win32, Python 3.8.1, pytest 5.4.3, pytest-sugar 0.9.4)
cachedir: .pytest_cache
metadata: {'Python': '3.8.1', 'Platform': 'Windows-10-10.0.18362-SP0', 'Packages': {'pytest': '5.4.3', 'py': '1.9.0', 'pluggy': '0.13.1'}, 'Plugins': {'allure-pytest': '2.8.16', 'assume': '2.2.1', 'cov':
'2.10.0', 'emoji': '0.2.0', 'forked': '1.2.0', 'html': '2.1.1', 'metadata': '1.10.0', 'ordering': '0.6', 'repeat': '0.8.0', 'rerunfailures': '9.0', 'sugar': '0.9.4', 'timeout': '1.4.1', 'xdist': '1.33.0
'}, 'JAVA_HOME': 'C:\\Program Files\\Java\\jdk1.8.0_202'}
rootdir: C:\Users\18566\Desktop\APPAutoTest\pytest_leran
plugins: allure-pytest-2.8.16, assume-2.2.1, cov-2.10.0, emoji-0.2.0, forked-1.2.0, html-2.1.1, metadata-1.10.0, ordering-0.6, repeat-0.8.0, rerunfailures-9.0, sugar-0.9.4, timeout-1.4.1, xdist-1.33.0
collecting ...
test_sample.py::testanswer ✓ 50% █████
test_sample.py::TestA.test_x ✓ 100% █████
█████
Results (0.18s):
2 passed
查看用例只收集了test开头的用例和Test开头的类(类里面也是查找test开头的方法)的用例。
100%显示已经执行完成所有的用例。
运行方式可以直接在pycharm里面或者IDE等工具进入terminal执行pytest可以直接找到符合命名规则的用例并执行。
指定测试用例文件则pytest 文件名
每个收集的测试都分配有一个唯一的nodeid名称,该名称由模块文件名后跟说明符(例如类名,函数名和参数化参数)组成,并用::字符分隔
指定测试文件具体的测试函数则 pytest 文件名::测试函数名
指定测试文件具体的测试类 pytest 文件名::类名
指定测试文件具体的测试方法 pytest 文件名::类名::方法名
如果不指定则默认在当前目录查看所有符合的用例。
没有特殊指定,以test_.py或者_test.py的文件都会被作为测试用例文件。
2.1 pytest遇到失败直接停止
pytest -x
遇到失败直接停止
2.2 pytest遇到失败停止设置失败次数
pytest --maxfail==2
遇到2次失败则停止
2.3 pytest通过关键字表达式运行测试
pytest -k “Myclass and not method”
运行myClass的类且不运行method名字的方法的
这个myclass和method的名字不区分大小写
上面的示例将运行,TestMyClass.test_something 但不会运行TestMyClass.test_method_simple
2.4pytest通过标记表达式运行测试
pytest -m slow
将运行用@pytest.mark.slow装饰器装饰的所有测试
2.5 pytest带参数运行输出 详细的结果
pytest -r
在测试会话结束时显示“简短的测试摘要信息”,从而使得在大型测试套件中轻松获得所有失败,跳过,xfails等的清晰画面
-r选项后面接受多个字符
适配的字符有:
这是可以使用的可用字符的完整列表:
f -失败
E -错误
s -跳过
x -xfailed
X -xpass
p -通过
P -通过输出
a -除 pP
A -全部
N-无,可用于不显示任何内容(fE默认设置)
比如:
仅查看失败和跳过的测试:pytest -rfs
仅查看所有通过的测试:pytest -rp
2.6 分析测试执行持续时间
获取最慢的10个测试持续时间的列表:
pytest --durations=10
默认情况下,除非-vv(打印详细信息)在命令行传递,否则pytest不会显示太短执行的执行时间,比如<0.01s.
2.7 从Python代码中调用pytest
上述介绍了一部分命令参数,但是都是直接在命令行执行的。在python中执行则需要导入pytest,然后用pytest.main()函数执行。
传递参数则是向main传入一个列表,如下格式:
pytest.main(["-v","-s",“class::fucntion”])
3 pytest fixtures不加参数调用
pytest fixture是对setup和teardown的提升。
之前unittest setup和teardown是针对测试用例前准备环境和测试用例执行后销毁环境,或者是setup_class和teardown_class。
fixtures可以声明是在test的函数、模块、类或者整个session生效。
fixtures也可以进行参数化,测试用例通过配置和选项运行fixtures,fixtures可以在不同用例多次调用。
fixtures定义是用装饰器@pytest.fixture
简单例子示例:
test_smtpsimple.py
```css
import pytest
@pytest.fixture
def smtp_connection():
import smtplib
return smtplib.SMTP("smtp.qiye.163.com", 25, timeout=15)
def test_ehlo(smtp_connection):
response, msg = smtp_connection.ehlo()
print(response,msg)
assert response == 250
assert 0 # for demo purposes
上述是一种使用fixture的方式,smtp_connection用装饰器@pytest.fixture
在测试用例test_ehlo中调用smtp_connection,这种方式可以在test_ehlo调用smtp_connection的方法或者参数等.
当运行pytest时会自动去找@pytest.fixture装饰器装饰的函数
运行结果如下:
C:\Users\18566\Desktop\APPAutoTest\pytest_leran>pytest -vv
Test session starts (platform: win32, Python 3.8.1, pytest 5.4.3, pytest-sugar 0.9.4)
cachedir: .pytest_cache
metadata: {'Python': '3.