(一)介紹
pytest是一個非常成熟的全功能的Python測試框架,主要特點有以下幾點:
1、簡單靈活,容易上手;
2、支持參數化;
3、能夠支持簡單的單元測試和復雜的功能測試,還可以用來做selenium/appnium等自動化測試、接口自動化測試(pytest+requests);
4、pytest具有很多第三方插件,並且可以自定義擴展,比較好用的如pytest-selenium(集成selenium)、pytest-html(完美html測試報告生成)、pytest-rerunfailures(失敗case重復執行)、pytest-xdist(多CPU分發)等;
5、測試用例的skip和xfail處理;
6、可以很好的和jenkins集成;
(二)安裝
pip install -U pytest # 通過pip安裝
pip install -U pytest-html
pip install -U pytest-rerunfailures
py.test --version # 查看pytest版本
This is pytest version 2.7.2, imported from C:\Python27\lib\site-packages\pytest.pyc
此外還有很多很好的第三方插件,請到http://plugincompat.herokuapp.com/ 和 https://pypi.python.org/pypi?%3Aaction=search&term=pytest-&submit=search 查找
(三)例子
這里列幾個pytest-document中的例子
1、默認執行當前目錄下的所有以test_為前綴(test_*.py)或以_test為后綴(*_test.py)的文件中以test_為前綴的函數
import pytest
# content of test_sample.py
def func(x):
return x + 1
def test_answer():
assert func(3) == 5
運行 py.test 或 指定特定文件 py.test -q test_sample.py

2、使用類來組成多個用例的
import pytest
# content of test_class.py
class TestClass:
def test_one(self):
x = "this"
assert 'h' in x
def test_two(self):
x = "hello"
assert hasattr(x, 'check')

3、在python中調用pytest: python test_class.py
import pytest
# content of test_class.py
class TestClass:
def test_one(self):
print 'one'
x = "this"
assert 'h' in x
def test_two(self):
print 'two'
x = "hello"
assert hasattr(x, 'check')
if __name__ == '__main__':
pytest.main("-q --html=a.html")

4、來個支持參數化的例子,參數化使用pytest.mark.parametrize的參數,第一個為變量的元組,第二個是變量賦值的元組列表,具體下面的章節會仔細介紹
# content of test_time.py
import pytest
from datetime import datetime, timedelta
testdata = [
(datetime(2001, 12, 12), datetime(2001, 12, 11), timedelta(1)),
(datetime(2001, 12, 11), datetime(2001, 12, 12), timedelta(-1)),
]
@pytest.mark.parametrize("a,b,expected", testdata)
def test_timedistance_v0(a, b, expected):
diff = a - b
assert diff == expected
@pytest.mark.parametrize("a,b,expected", testdata, ids=["forward", "backward"])
def test_timedistance_v1(a, b, expected):
diff = a - b
assert diff == expected
def idfn(val):
if isinstance(val, (datetime,)):
# note this wouldn't show any hours/minutes/seconds
return val.strftime('%Y%m%d')
@pytest.mark.parametrize("a,b,expected", testdata, ids=idfn)
def test_timedistance_v2(a, b, expected):
diff = a - b
assert diff == expected

