经过了对unittest应用HtmlTestRunner长达半个小时的“大眼瞪小眼”,开始在无所不知的Internet上搜索,有没有对于python基础超超超超级薄弱的人更友好的测试框架,然后发现了pytest。浏览了几篇分析python测试框架的文章,相信了它的简单、易用、插件丰富,于是,开始决定学习pytest了。
我坚信自己不是猴子下山,pytest就是我可以抱回家的大西瓜。
下面圆规正传。
下载及配置更改
pytest作为python的第三方测试框架,同样需要下载
pip3 install pytest
如果是用pycharm编写代码的,为了可以直接在测试文件中执行run操作,需要改一下pycharm配置,具体路径是:
Pycharm>Preferrences>Tools>Python Integrated Tools,将Testing下方的Default test runner由unittest改为pytest,之后就可以利用run执行。
应用规则
- pytest调用的测试文件需要以
test_
开头或者_test
结尾; - pytest执行的类名需要以
Test
开头,类下不能有__init__
方法,执行的函数需要以test
开头; - 断言应用
assert
- 包pakege需要有init.py文件,否则引用会不成功。
- 运行时可以直接在命令行中:
pytest test_*.py
或是在pycharm中,测试文件内写入下方代码,用run执行。
import pytest
if __name__=='__main__':
pytest.main()#在这里可以填写运行参数,执行或输出不同内容
应用示例
import pytest
class TestClass():
def test_one(self):
x = "this"
assert "h" in x
def test_two(self):
x = "hello"
assert x == "hi"
def test_three(self):
x = "world"
assert x != "worl"
if __name__=='__main__':
pytest.main()
执行的时候要注意,如果pytest.main()
中的运行参数不起作用,可能是直接右键选择Run'pytest in test_*.py
导致。这种情况是不会执行main
下方的语句的。需要点击上方的Run>Run...,直接选择文件名,可正常执行。
标记过滤
如果想执行特定的用例,可以通过pytest.mark
在函数前打标记,执行的时候用-m
传入标记即可。
@pytest.mark.abc
def test_one(self):
x = "this"
assert "h" in x
@pytest.mark.def
def test_two(self):
x = "hello"
assert x == "hi"
if __name__=='__main__':
pytest.main('-m abc')#运行后只执行第一个,不会执行第二个
标记跳过
如果想跳过某一个用例,即在此用例前方标记@pytest.mark.skip
跳过也可以设置条件,例如@pytest.mark.skipif(a>4,reason='guess why')
,设置条件时,必须传入reason参数
参数化
如果需要以变量进行参数传递来执行测试,可在此测试函数前方标记@pytest.mark.parametrize()
,注意class下的函数第一个参数需要时self
,同时对应函数记得传parametrize标记的参数。
举例:
import pytest
class Testclass:
@pytest.mark.parametrize('choice',["A","b"])
def test001(self,choice):
assert len(choice)==1
自我记录,有错误欢迎指正~