单元测试框架,大家较为熟悉的有Unittest、Nose(unittest的扩展)。Pytest倒是名不见经传,但是自从用了之后,就爱不释手,就像它自己描述的一样:simple powerful testing with Python。简单好用的参数化以及多种运行模式,让测试脚本简单清晰,调试运行更加方便。
一、参数化
比如我们在做自动化测试,当传入不同的参数时,期望返回的status code为200。如果用Unittest做这块参数化比较复杂,而pytest会简单很多。在pytest中有pytest.mark.parametrize 装饰器,轻松解决问题。我们就拿sogo的搜索作为例子。
用例说明:
步骤一、打开搜狗搜索(http://www.sogou.com/)
步骤二、输入tesla后点放大镜搜索
期望:返回正常
如果用接口来做的话,就相当于在query参数后面传tesla即可,验证状态码为200
如果用接口来做的话,就相当于在query参数后面传tesla即可,验证状态码为200
Import requests Session = requests.session() url = 'https://www.sogou.com/web?' para = {'query': 'tesla'} r = session.get(url, params=para, verify=False, allow_redirects=False) assert r.status_code == 200 |
事实上,如果仅仅传一个搜索词就认为这个接口正常,那么很可能就出大篓子。所以我们可能需要传n个搜索词做验证。也就是说,para中的query后面的内容我们需要传多个不同的搜索词。比如说我们想搜索VR,BITCOIN等多个词的话,需要怎么做呢?这个时候就是使用pytest中有pytest.mark.parametrize 装饰器,如下代码第8行,通过在方法外面加一个装饰器就可以了。
Import pytest Import requests Session = requests.session() url = https://www.sogou.com/web?' search= ['tesla','VR','BITCOIN'] @pytest.mark.parametrize('test_input',search) def test_status_code(test_input): para = {'query':test_input} r= session.get(url,params=para, verify=False, allow_redirects=False) assert r.status_code == 200 |
此时有可能有同学提出疑问,对于多个参数我们用for循环也是可以做的,为何要用这个方法。原因是用pytest的参数化,传入的一个参数就是一个case,上面的例子我们传入了三个参数,那么形成的就是三个cases,哪个参数传入导致出错了,我们一目了然。那么要怎么做呢?我们在cmd里面运行脚本,假设脚本文件名为test_sogo_search.py,位置放在C盘下:
C:\>pytest test_sogo_search.py --html=./result/Report.html
在pytest的报告中你看到的是这样的
通过这样的报告,就能很清晰的知道哪个搜索词的验证结果是正确,哪个搜索词验证的结果是错误的。比起用for循环来说,是要清晰很多了。另外还有运行的时长,也是能给到额外的信息。
二、运行模式
Pytest的多种运行模式,让测试和调试变得更加得心应手,下面介绍5种用的比较多的模式。在介绍之前需要提醒一句,运行pytest时会找test开头的文件以及以test开头的方法或者class,不然就会提示找不到可以运行的case了。
1、运行后产生结果报告(htmlReport)
运行模式:
pytest test_case.py --html=./result/test_caseReport.html
效果:
当运行出错时,在report里能直观的看到错误原因,上图中,预期希望的status_code是302,但是实际是200,所以就报错了。看着报告定位问题就变的非常容易。且测试结果不用整理,直接提交报告即可。
2、运行指定的Case
代码块(test_case.py)
class TestClassOne(object): def test_one(self): x = "this" assert 'h' in x def test_two(self): x = "hello" assert hasattr(x, 'check') class TestClassTwo(object): def test_one(self): x = "this" assert 'h' in x def test_two(self): x = "hello" assert hasattr(x, 'check') |
运行模式:
模式1:$ pytest test_case.py
模式2:$ pytest test_case.py::TestClassTwo
模式3:$ pytest test_case.py::TestClassTwo::test_one
... ...
查看更多精彩内容,请点击下载:
版权声明:本文出自《51测试天地》第四十九期。51Testing软件测试网及相关内容提供者拥有51testing.com内容的全部版权,未经明确的书面许可,任何人或单位不得对本网站内容复制、转载或进行镜像,否则将追究法律责任。