python_pytest

一。过滤用例

1.定义

pytest,是由第三方开发的一个python单元测试框架,与python自带的unittest有些类似(pytest不完全兼容unittest)。

与unittest相比:

优点:

1)编写用例比较灵活,不需要unittest那样先继承,setUp,tearDown这样的写法,pytest中可以在函数或者类中使用

2)pytest更加简洁灵活(筛选用例)

3)不需要加载用例,自动发现用例

4)pytest兼容unittest

  --pytest的 parametrize 、fixture、hook 、无法兼容unittest兼容

5)可以使用测试插件

6)引用测试报告更加方便

不足之处:

1)unittest是python自带的标准库,不需要安装

2)不需要考虑与python版本兼容的问题

注意:

 

2.parametrize 数据驱动

1)调用方法:

@pytest.mark.parametrize("test_info", page_footing_expected)
def test_login(self, test_info, driver):
  '''
  test_info:需要和 parametrize中的写法保持一致
  page_footing_expected:测试数据,目前只写了预期结果
  driver:前置条件,打开某个网址后的driver
  '''
  try:
  # 获取预期结果
  expected = test_info
  # 操作步骤
  actual = home_page.get().page_footing().page_footing_keyword_click()
  assert expected == actual
  except Exception as e:
  logger.error("测试失败用例不通过")
  raise e

2)与unittest中的ddt 相比还是有很大区别的:

  --首先不用继承unittest.Testcase 

  --不用在测试类上面写装饰器:@ddt.ddt (pytest 是可以不用写类就可以运行 测试用例的)

    --在unitest中需要使用self.assert..来进行结果比对 pytest 直接使用assert就可以了

3.pytest发现用例的规则(也可以在pytest.ini配置文件中重新设置发现规则)

1)模块名称以test_或者_test.py

2)测试类中不能有__init__(self)

3)方法名称必须以test_开头

4)pytest测试用例可以脱离类的形式,可以直接使用函数的形式;类也可以不集成unittest.TestCase

5)自动发现用例(以如上1)、2)、3)的规则),unittest需要加载用例,用例执行顺序是按照ASCII码的顺序执行,pytest是按照用例的先后顺序一条条执行。

 

4.过滤用例

1)先注册ini文件,添加标签名(pytest.ini)

 

 2)打标签:需要在测试用例函数上面加 @pytest.mark.标签名 (标签名:步骤1)注册的标签名)

 

 

3)运行制定标签用例:

-m 运行指定标签名的测试用例

  --or :error_test or sucess_test :只有有这两个标签中的其中一个标签就会运行

  --and :error_test and sucess_test :找到同时有这两个标签的用例运行

-s 捕获所有的输出,如果不加-s输出信息不会展示

  1.控制台命令:python -m "标签名"

  2.python文件中执行:

  if __name__ == "__main__":

    #执行标签名为error_test的用例
    pytest.main("-m error_test")

  3.引用测试报告:

  if __name__ == "__main__":

    #新增一个时间戳

    ts = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S")

    #引入html测试报告,使用测试报告时需要先下载测试报告(pip install pytest-html)
    pytest.main(["--html={}.html".format(ts), "-m error_test"])

      #运行多个标签

    pytest.main(["--html={}.html".format(ts),"-m error_test","-m suesses"])

5.测试夹具

1).测试夹具设置(需要写在固定py文件中 =‘conftest’,该文件一般与‘run.py’同级放置--也就是放在最外层)

  yield:相当于unittest中的setup和teardown前置准备机制

@pytest.fixture(scope="function")
def driver():
'''
  yield之前为前置条件
  yield之后的为后置条件
  yield 并排的driver是返回的参数,此处可以把driver返回
管理浏览器
function:每次执行都调用
class:一个类只执行一次
module:一个模块中只执行一次
:return:
'''
from selenium import webdriver
driver=webdriver.Chrome()
driver.implicitly_wait(WAIT_TIME)
yield driver
driver.quit()

 2).测试夹具的使用:

 

pytest.main(["--html={}.html".format(ts),"-m error_test","-m suesses"])
assertTrue

二。重运行
安装:pip install pytest-rerunfailures
执行:pytest -- reruns 2 --reruns-delay 5 :运行失败后每隔5秒中运行一次,总共重新运行2次
   pytest.main(['--reruns','5']) :运行失败后重新运行5次
posted @ 2020-07-31 20:01  1142783691  阅读(199)  评论(0编辑  收藏  举报