好用的Pytest单元测试框架

发表于:2018-4-20 09:08

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:邵君兰    来源:51Testing软件测试网原创

  单元测试框架,大家较为熟悉的有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内容的全部版权,未经明确的书面许可,任何人或单位不得对本网站内容复制、转载或进行镜像,否则将追究法律责任。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号