截图

在mini中截图使用的是screenshot_pic方法

  1. @allure.step("截图并存放到「{path}」中")

  2. def screenshot_pic(self, path: str):

  3.     self.native.screen_shot(path)        

两种断言方式

在编写测试用例的时候会使用到两种断言方式

  1. # 常规方式

  2. assert False, '错误描述'

  3. # 多重断言 使用pytest-assume插件

  4. pytest.assume(False, '错误描述')

常规方式断言失败截图

常规方式断言会在用例执行失败后结束当前用例,所以使用pytest自带的钩子:pytest_runtest_makereport

  1. @hookspec(firstresult=True)

  2. def pytest_runtest_makereport(

  3.     item: "Item", call: "CallInfo[None]"

  4. ) -> Optional["TestReport"]:

  5.     """Called to create a :class:`~pytest.TestReport` for each of

  6.     the setup, call and teardown runtest phases of a test item.

  7.     See :hook:`pytest_runtest_protocol` for a description of the runtest protocol.

  8.     :param item: The item.

  9.     :param call: The :class:`~pytest.CallInfo` for the phase.

  10.     Stops at first non-None result, see :ref:`firstresult`.

  11.     """

它会在用例执行完成后进入

在执行后判断一下当前case是否失败或异常,如果是则截图

所以当一个对象有native对象时,它就能进行截图

使用item.funcargs.items()从堆栈中找到包含native对象的对象,然后进行截图

 
  1. @pytest.hookimpl(tryfirst=True, hookwrapper=True)

  2. def pytest_runtest_makereport(item, call):

  3.     """

  4.     pytest 失败后执行

  5.     :param item: 测试用例

  6.     :param call: 测试步骤

  7.     :return:

  8.     """

  9.     out = yield

  10.     result = out.get_result()

  11.     if result.outcome in ['failed', 'error']:

  12.         for k, v in item.funcargs.items():

  13.             try:

  14.                 if hasattr(v, 'native'):

  15.                     attach_png(f'{Constant().TEST_PIC}/{int(time.time())}.png', "失败截图", v)

  16.                     break

  17.             except Exception as e:

  18.                 logger.error(f"失败截图异常:{e}")

多重断言失败截图

在pytest_assume插件中有一个hook:pytest_assume.hooks.pytest_assume_fail

 
  1. def pytest_assume_fail(lineno, entry):

  2.     """

  3.     Hook to manipulate user-defined data in-case of assumption failure.

  4.     lineno: Line in the code from where asumption failed.

  5.     entry: The assumption failure message generated from assume() call

  6.     """

  7.     pass

当assume第一个参数是False时,它就会进入pytest_assume_fail钩子

同上,找到包含native对象的对象,然后进行截图

  1. def pytest_assume_fail(lineno, entry):

  2.     """

  3.     assume 断言报错截图

  4.     """

  5.     for i in inspect.stack():

  6.         if os.path.split(i.filename)[1].startswith('test_'):

  7.             try:

  8.                 for k, v in i.frame.f_locals.items():

  9.                     if hasattr(v, 'native'):

  10.                         attach_png(f'{Constant().TEST_PIC}/{int(time.time())}.png', f"失败截图_{int(time.time())}", v)

  11.                         break

  12.             except Exception as e:

  13.                 logger.error(f"失败截图异常:{e}")

 

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

 

          视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。

更多推荐