最快最便捷的pytest使用allure测试报告

一、前言

最近通过群友了解到了allure这个报告,开始还不以为然,但还是逃不过真香定律。

经过试用之后,发现这个报告真的很好,很适合自动化测试结果的展示。下面说说我的探索历程吧。

  • 选用的项目为Selenium自动化测试Pytest框架实战,在这个项目的基础上说allure报告。

二、allure安装

  • 首先安装python的allure-pytest包
  1. <span style="color:#596172"><span style="background-color:#ffffff"><code class="language-shell">pip install allure-pytest

  2. </code></span></span>

  • 然后安装allure的command命令行程序

MacOS直接使用homebrew工具执行 brew install allure 即可安装,不用配置下载包和配置环境

在GitHub下载安装程序https://github.com/allure-framework/allure2/releases

但是由于GitHub访问太慢,我已经下载好并放在了群文件里面

下载完成后解压放到一个文件夹。我的路径是D:\Program Files\allure-2.13.3

然后配置环境变量: 在系统变量path中添加D:\Program Files\allure-2.13.3\bin,然后确定保存。

打开cmd,输入allure,如果结果显示如下则表示成功了:

  1. <span style="color:#596172"><span style="background-color:#ffffff"><code class="language-powershell">C:\Users\hoou>allure

  2. Usage: allure [<span style="color:#d19a66">options</span>] [<span style="color:#d19a66">command</span>] [<span style="color:#d19a66">command</span> <span style="color:#d19a66">options</span>]

  3. Options:

  4. <span style="color:#56b6c2">--help</span>

  5. Print commandline help.

  6. <span style="color:#56b6c2">-q</span>, <span style="color:#56b6c2">--quiet</span>

  7. <span style="color:#7171bf">Switch</span> on the quiet mode.

  8. Default: false

  9. <span style="color:#56b6c2">-v</span>, <span style="color:#56b6c2">--verbose</span>

  10. <span style="color:#7171bf">Switch</span> on the verbose mode.

  11. Default: false

  12. <span style="color:#56b6c2">--version</span>

  13. Print commandline version.

  14. Default: false

  15. Commands:

  16. generate Generate the report

  17. Usage: generate [<span style="color:#d19a66">options</span>] The directories with allure results

  18. Options:

  19. <span style="color:#56b6c2">-c</span>, <span style="color:#56b6c2">--clean</span>

  20. Clean Allure report directory before generating a new one.

  21. Default: false

  22. <span style="color:#56b6c2">--config</span>

  23. Allure commandline config path. <span style="color:#7171bf">If</span> specified overrides values from

  24. <span style="color:#56b6c2">--profile</span> and <span style="color:#56b6c2">--configDirectory</span>.

  25. <span style="color:#56b6c2">--configDirectory</span>

  26. Allure commandline configurations directory. By default uses

  27. ALLURE_HOME directory.

  28. <span style="color:#56b6c2">--profile</span>

  29. Allure commandline configuration profile.

  30. <span style="color:#56b6c2">-o</span>, <span style="color:#56b6c2">--report-dir</span>, <span style="color:#56b6c2">--output</span>

  31. The directory to generate Allure report into.

  32. Default: allure<span style="color:#56b6c2">-report</span>

  33. serve Serve the report

  34. Usage: serve [<span style="color:#d19a66">options</span>] The directories with allure results

  35. Options:

  36. <span style="color:#56b6c2">--config</span>

  37. Allure commandline config path. <span style="color:#7171bf">If</span> specified overrides values from

  38. <span style="color:#56b6c2">--profile</span> and <span style="color:#56b6c2">--configDirectory</span>.

  39. <span style="color:#56b6c2">--configDirectory</span>

  40. Allure commandline configurations directory. By default uses

  41. ALLURE_HOME directory.

  42. <span style="color:#56b6c2">-h</span>, <span style="color:#56b6c2">--host</span>

  43. This host will be used to <span style="color:#7171bf">start</span> web server <span style="color:#7171bf">for</span> the report.

  44. <span style="color:#56b6c2">-p</span>, <span style="color:#56b6c2">--port</span>

  45. This port will be used to <span style="color:#7171bf">start</span> web server <span style="color:#7171bf">for</span> the report.

  46. Default: <span style="color:#d19a66">0</span>

  47. <span style="color:#56b6c2">--profile</span>

  48. Allure commandline configuration profile.

  49. open Open generated report

  50. Usage: open [<span style="color:#d19a66">options</span>] The report directory

  51. Options:

  52. <span style="color:#56b6c2">-h</span>, <span style="color:#56b6c2">--host</span>

  53. This host will be used to <span style="color:#7171bf">start</span> web server <span style="color:#7171bf">for</span> the report.

  54. <span style="color:#56b6c2">-p</span>, <span style="color:#56b6c2">--port</span>

  55. This port will be used to <span style="color:#7171bf">start</span> web server <span style="color:#7171bf">for</span> the report.

  56. Default: <span style="color:#d19a66">0</span>

  57. plugin Generate the report

  58. Usage: plugin [<span style="color:#d19a66">options</span>]

  59. Options:

  60. <span style="color:#56b6c2">--config</span>

  61. Allure commandline config path. <span style="color:#7171bf">If</span> specified overrides values from

  62. <span style="color:#56b6c2">--profile</span> and <span style="color:#56b6c2">--configDirectory</span>.

  63. <span style="color:#56b6c2">--configDirectory</span>

  64. Allure commandline configurations directory. By default uses

  65. ALLURE_HOME directory.

  66. <span style="color:#56b6c2">--profile</span>

  67. Allure commandline configuration profile.

  68. </code></span></span>

三、allure初体验

改造一下之前的测试用例代码

  1. <span style="color:#596172"><span style="background-color:#ffffff"><code class="language-python"><span style="color:#5c6370"><em>#!/usr/bin/env python3</em></span>

  2. <span style="color:#5c6370"><em># -*- coding:utf-8 -*-</em></span>

  3. <span style="color:#7171bf">import</span> re

  4. <span style="color:#7171bf">import</span> pytest

  5. <span style="color:#7171bf">import</span> allure

  6. <span style="color:#7171bf">from</span> utils.logger <span style="color:#7171bf">import</span> log

  7. <span style="color:#7171bf">from</span> common.readconfig <span style="color:#7171bf">import</span> ini

  8. <span style="color:#7171bf">from</span> page_object.searchpage <span style="color:#7171bf">import</span> SearchPage

  9. <span style="color:#61aeee">@allure.feature(<span style="color:#3388aa">"测试百度模块"</span>)</span>

  10. <span style="color:#7171bf">class</span> <span style="color:#61aeee">TestSearch</span>:

  11. <span style="color:#61aeee"> @pytest.fixture(scope=<span style="color:#3388aa">'function'</span>, autouse=<span style="color:#56b6c2">True</span>)</span>

  12. <span style="color:#7171bf">def</span> <span style="color:#61aeee">open_baidu</span>(self, drivers):

  13. <span style="color:#98c379">"""打开百度"""</span>

  14. search = SearchPage(drivers)

  15. search.get_url(ini.url)

  16. <span style="color:#61aeee"> @allure.story(<span style="color:#3388aa">"搜索selenium结果用例"</span>)</span>

  17. <span style="color:#7171bf">def</span> <span style="color:#61aeee">test_001</span>(self, drivers):

  18. <span style="color:#98c379">"""搜索"""</span>

  19. search = SearchPage(drivers)

  20. search.input_search(<span style="color:#98c379">"selenium"</span>)

  21. search.click_search()

  22. result = re.search(<span style="color:#98c379">r'selenium'</span>, search.get_source)

  23. log.info(result)

  24. <span style="color:#7171bf">assert</span> result

  25. <span style="color:#61aeee"> @allure.story(<span style="color:#3388aa">"测试搜索候选用例"</span>)</span>

  26. <span style="color:#7171bf">def</span> <span style="color:#61aeee">test_002</span>(self, drivers):

  27. <span style="color:#98c379">"""测试搜索候选"""</span>

  28. search = SearchPage(drivers)

  29. search.input_search(<span style="color:#98c379">"selenium"</span>)

  30. log.info(<span style="color:#7171bf">list</span>(search.imagine))

  31. <span style="color:#7171bf">assert</span> <span style="color:#7171bf">all</span>([<span style="color:#98c379">"selenium"</span> <span style="color:#7171bf">in</span> i <span style="color:#7171bf">for</span> i <span style="color:#7171bf">in</span> search.imagine])

  32. <span style="color:#7171bf">if</span> __name__ == <span style="color:#98c379">'__main__'</span>:

  33. pytest.main([<span style="color:#98c379">'TestCase/test_search.py'</span>, <span style="color:#98c379">'--alluredir'</span>, <span style="color:#98c379">'./allure'</span>])

  34. os.system(<span style="color:#98c379">'allure serve allure'</span>)

  35. </code></span></span>

然后运行一下:

注意:如果你使用的是pycharm编辑器,请跳过该运行方式,直接使用.bat.sh的方式运行

  1. <span style="color:#596172"><span style="background-color:#ffffff"><code class="language-shell">***

  2. ------------------------------- generated html file: file://C:\Users\hoou\PycharmProjects\web-demotest\report.html --------------------------------

  3. Results (12.97s):

  4. 2 passed

  5. Generating report to temp directory...

  6. Report successfully generated to C:\Users\hoou\AppData\Local\Temp\112346119265936111\allure-report

  7. Starting web server...

  8. 2020-06-18 22:52:44.500:INFO::main: Logging initialized @1958ms to org.eclipse.jetty.util.log.StdErrLog

  9. Server started at <http://172.18.47.241:6202/>. Press <Ctrl+C> to exit

  10. </code></span></span>

命令行会出现如上提示,接着浏览器会自动打开:

点击左下角En即可选择切换为中文。

是不是很清爽很友好,比pytest-html更舒服。

四、allure装饰器介绍

五、报告的生成和展示

刚才的两个命令:

  • 生成allure原始报告到report/allure目录下,生成的全部为json或txt文件。
 
  1. <span style="color:#596172"><span style="background-color:#ffffff"><code class="language-powershell">pytest TestCase/test_search.py <span style="color:#56b6c2">--alluredir</span> ./allure

  2. </code></span></span>

  • 在一个临时文件中生成报告并启动浏览器打开
  1. <span style="color:#596172"><span style="background-color:#ffffff"><code class="language-powershell">allure serve allure

  2. </code></span></span>

但是在关闭浏览器之后这个报告就再也打不开了。不建议使用这种。

所以我们必须使用其他的命令,让allure可以指定生成的报告目录。

我们在项目的根目录中创建run_case.py文件,内容如下:

  1. <span style="color:#596172"><span style="background-color:#ffffff"><code class="language-python"><span style="color:#5c6370"><em>#!/usr/bin/env python3</em></span>

  2. <span style="color:#5c6370"><em># -*- coding:utf-8 -*-</em></span>

  3. <span style="color:#7171bf">import</span> sys

  4. <span style="color:#7171bf">import</span> subprocess

  5. WIN = sys.platform.startswith(<span style="color:#98c379">'win'</span>)

  6. <span style="color:#7171bf">def</span> <span style="color:#61aeee">main</span>():

  7. <span style="color:#98c379">"""主函数"""</span>

  8. steps = [

  9. <span style="color:#98c379">"venv\\Script\\activate"</span> <span style="color:#7171bf">if</span> WIN <span style="color:#7171bf">else</span> <span style="color:#98c379">"source venv/bin/activate"</span>,

  10. <span style="color:#98c379">"pytest --alluredir allure-results --clean-alluredir"</span>,

  11. <span style="color:#98c379">"allure generate allure-results -c -o allure-report"</span>,

  12. <span style="color:#98c379">"allure open allure-report"</span>

  13. ]

  14. <span style="color:#7171bf">for</span> step <span style="color:#7171bf">in</span> steps:

  15. subprocess.run(<span style="color:#98c379">"call "</span> + step <span style="color:#7171bf">if</span> WIN <span style="color:#7171bf">else</span> step, shell=<span style="color:#56b6c2">True</span>)

  16. <span style="color:#7171bf">if</span> __name__ == <span style="color:#98c379">"__main__"</span>:

  17. main()

  18. </code></span></span>

命令释义:

1、使用pytest生成原始报告,里面大多数是一些原始的json数据,加入--clean-alluredir参数清除allure-results历史数据。

  1. <span style="color:#596172"><span style="background-color:#ffffff"><code class="language-powershell">pytest <span style="color:#56b6c2">--alluredir</span> allure<span style="color:#56b6c2">-results</span> <span style="color:#56b6c2">--clean-alluredir</span>

  2. </code></span></span>

  • --clean-alluredir 清除allure-results历史数据

2、使用generate命令导出HTML报告到新的目录

 
  1. <span style="color:#596172"><span style="background-color:#ffffff"><code class="language-powershell">allure generate allure<span style="color:#56b6c2">-results</span> <span style="color:#56b6c2">-o</span> allure<span style="color:#56b6c2">-report</span>

  2. </code></span></span>

  • -c 在生成报告之前先清理之前的报告目录
  • -o 指定生成报告的文件夹

3、使用open命令在浏览器中打开HTML报告

  1. <span style="color:#596172"><span style="background-color:#ffffff"><code class="language-powershell">allure open allure<span style="color:#56b6c2">-report</span>

  2. </code></span></span>

好了我们运行一下该文件。

  1. <span style="color:#596172"><span style="background-color:#ffffff"><code class="language-powershell">Results (<span style="color:#d19a66">12.85</span>s):

  2. <span style="color:#d19a66">2</span> passed

  3. Report successfully generated to c:\Users\hoou\PycharmProjects\web<span style="color:#56b6c2">-demotest</span>\allure<span style="color:#56b6c2">-report</span>

  4. Starting web server...

  5. <span style="color:#d19a66">2020</span><span style="color:#56b6c2">-06-18</span> <span style="color:#d19a66">23</span>:<span style="color:#d19a66">30</span>:<span style="color:#d19a66">24.122</span>:INFO::main: Logging initialized @<span style="color:#d19a66">260</span>ms to org.eclipse.jetty.util.log.StdErrLog

  6. Server started at <http://<span style="color:#d19a66">172.18</span>.<span style="color:#d19a66">47.241</span>:<span style="color:#d19a66">7932</span>/>. Press <Ctrl+C> to <span style="color:#7171bf">exit</span>

  7. </code></span></span>

可以看到运行成功了。

在项目中的allure-report文件夹也生成了相应的报告。

六、allure发生错误截图

上面的用例全是运行成功的,没有错误和失败的,那么发生了错误怎么样在allure报告中生成错误截图呢,我们一起来看看。

首先我们先在config/conf.py文件中添加一个截图目录和截图文件的配置。

  1. <span style="color:#596172"><span style="background-color:#ffffff"><code class="language-python">+++

  2. <span style="color:#7171bf">class</span> <span style="color:#61aeee">ConfigManager</span>(<span style="color:#61aeee">object</span>):

  3. ...

  4. <span style="color:#61aeee"> @property</span>

  5. <span style="color:#7171bf">def</span> <span style="color:#61aeee">screen_path</span>(self):

  6. <span style="color:#98c379">"""截图目录"""</span>

  7. screenshot_dir = os.path.join(self.BASE_DIR, <span style="color:#98c379">'screen_capture'</span>)

  8. <span style="color:#7171bf">if</span> <span style="color:#7171bf">not</span> os.path.exists(screenshot_dir):

  9. os.makedirs(screenshot_dir)

  10. now_time = dt_strftime(<span style="color:#98c379">"%Y%m%d%H%M%S"</span>)

  11. screen_file = os.path.join(screenshot_dir, <span style="color:#98c379">"{}.png"</span>.<span style="color:#7171bf">format</span>(now_time))

  12. <span style="color:#7171bf">return</span> now_time, screen_file

  13. ...

  14. +++

  15. </code></span></span>

然后我们修改项目目录中的conftest.py

  1. <span style="color:#596172"><span style="background-color:#ffffff"><code class="language-python"><span style="color:#5c6370"><em>#!/usr/bin/env python3</em></span>

  2. <span style="color:#5c6370"><em># -*- coding:utf-8 -*-</em></span>

  3. <span style="color:#7171bf">import</span> base64

  4. <span style="color:#7171bf">import</span> pytest

  5. <span style="color:#7171bf">import</span> allure

  6. <span style="color:#7171bf">from</span> py.xml <span style="color:#7171bf">import</span> html

  7. <span style="color:#7171bf">from</span> selenium <span style="color:#7171bf">import</span> webdriver

  8. <span style="color:#7171bf">from</span> config.conf <span style="color:#7171bf">import</span> cm

  9. <span style="color:#7171bf">from</span> common.readconfig <span style="color:#7171bf">import</span> ini

  10. <span style="color:#7171bf">from</span> utils.times <span style="color:#7171bf">import</span> timestamp

  11. <span style="color:#7171bf">from</span> utils.send_mail <span style="color:#7171bf">import</span> send_report

  12. driver = <span style="color:#56b6c2">None</span>

  13. <span style="color:#61aeee">@pytest.fixture(scope=<span style="color:#3388aa">'session'</span>, autouse=<span style="color:#56b6c2">True</span>)</span>

  14. <span style="color:#7171bf">def</span> <span style="color:#61aeee">drivers</span>(request):

  15. <span style="color:#7171bf">global</span> driver

  16. <span style="color:#7171bf">if</span> driver <span style="color:#7171bf">is</span> <span style="color:#56b6c2">None</span>:

  17. driver = webdriver.Chrome()

  18. driver.maximize_window()

  19. <span style="color:#7171bf">def</span> <span style="color:#61aeee">fn</span>():

  20. driver.quit()

  21. request.addfinalizer(fn)

  22. <span style="color:#7171bf">return</span> driver

  23. <span style="color:#61aeee">@pytest.hookimpl(hookwrapper=<span style="color:#56b6c2">True</span>)</span>

  24. <span style="color:#7171bf">def</span> <span style="color:#61aeee">pytest_runtest_makereport</span>(item):

  25. <span style="color:#98c379">"""

  26. 当测试失败的时候,自动截图,展示到html报告中

  27. :param item:

  28. """</span>

  29. pytest_html = item.config.pluginmanager.getplugin(<span style="color:#98c379">'html'</span>)

  30. outcome = <span style="color:#7171bf">yield</span>

  31. report = outcome.get_result()

  32. report.description = <span style="color:#7171bf">str</span>(item.function.__doc__)

  33. extra = <span style="color:#7171bf">getattr</span>(report, <span style="color:#98c379">'extra'</span>, [])

  34. <span style="color:#7171bf">if</span> report.when == <span style="color:#98c379">'call'</span> <span style="color:#7171bf">or</span> report.when == <span style="color:#98c379">"setup"</span>:

  35. xfail = <span style="color:#7171bf">hasattr</span>(report, <span style="color:#98c379">'wasxfail'</span>)

  36. <span style="color:#7171bf">if</span> (report.skipped <span style="color:#7171bf">and</span> xfail) <span style="color:#7171bf">or</span> (report.failed <span style="color:#7171bf">and</span> <span style="color:#7171bf">not</span> xfail):

  37. screen_img = _capture_screenshot()

  38. <span style="color:#7171bf">if</span> screen_img:

  39. html = <span style="color:#98c379">'<div><img src="data:image/png;base64,%s" alt="screenshot" style="width:1024px;height:768px;" '</span> \

  40. <span style="color:#98c379">'onclick="window.open(this.src)" align="right"/></div>'</span> % screen_img

  41. extra.append(pytest_html.extras.html(html))

  42. report.extra = extra

  43. <span style="color:#7171bf">def</span> <span style="color:#61aeee">pytest_html_results_table_header</span>(cells):

  44. cells.insert(<span style="color:#d19a66">1</span>, html.th(<span style="color:#98c379">'用例名称'</span>))

  45. cells.insert(<span style="color:#d19a66">2</span>, html.th(<span style="color:#98c379">'Test_nodeid'</span>))

  46. cells.pop(<span style="color:#d19a66">2</span>)

  47. <span style="color:#7171bf">def</span> <span style="color:#61aeee">pytest_html_results_table_row</span>(report, cells):

  48. cells.insert(<span style="color:#d19a66">1</span>, html.td(report.description))

  49. cells.insert(<span style="color:#d19a66">2</span>, html.td(report.nodeid))

  50. cells.pop(<span style="color:#d19a66">2</span>)

  51. <span style="color:#7171bf">def</span> <span style="color:#61aeee">pytest_html_results_table_html</span>(report, data):

  52. <span style="color:#7171bf">if</span> report.passed:

  53. <span style="color:#7171bf">del</span> data[:]

  54. data.append(html.div(<span style="color:#98c379">'通过的用例未捕获日志输出.'</span>, class_=<span style="color:#98c379">'empty log'</span>))

  55. <span style="color:#7171bf">def</span> <span style="color:#61aeee">pytest_html_report_title</span>(report):

  56. report.title = <span style="color:#98c379">"pytest示例项目测试报告"</span>

  57. <span style="color:#7171bf">def</span> <span style="color:#61aeee">pytest_configure</span>(config):

  58. config._metadata.clear()

  59. config._metadata[<span style="color:#98c379">'测试项目'</span>] = <span style="color:#98c379">"测试百度官网搜索"</span>

  60. config._metadata[<span style="color:#98c379">'测试地址'</span>] = ini.url

  61. <span style="color:#7171bf">def</span> <span style="color:#61aeee">pytest_html_results_summary</span>(prefix, summary, postfix):

  62. <span style="color:#5c6370"><em># prefix.clear() # 清空summary中的内容</em></span>

  63. prefix.extend([html.p(<span style="color:#98c379">"所属部门: XX公司测试部"</span>)])

  64. prefix.extend([html.p(<span style="color:#98c379">"测试执行人: 随风挥手"</span>)])

  65. <span style="color:#7171bf">def</span> <span style="color:#61aeee">pytest_terminal_summary</span>(terminalreporter, exitstatus, config):

  66. <span style="color:#98c379">"""收集测试结果"""</span>

  67. result = {

  68. <span style="color:#98c379">"total"</span>: terminalreporter._numcollected,

  69. <span style="color:#98c379">'passed'</span>: <span style="color:#7171bf">len</span>(terminalreporter.stats.get(<span style="color:#98c379">'passed'</span>, [])),

  70. <span style="color:#98c379">'failed'</span>: <span style="color:#7171bf">len</span>(terminalreporter.stats.get(<span style="color:#98c379">'failed'</span>, [])),

  71. <span style="color:#98c379">'error'</span>: <span style="color:#7171bf">len</span>(terminalreporter.stats.get(<span style="color:#98c379">'error'</span>, [])),

  72. <span style="color:#98c379">'skipped'</span>: <span style="color:#7171bf">len</span>(terminalreporter.stats.get(<span style="color:#98c379">'skipped'</span>, [])),

  73. <span style="color:#5c6370"><em># terminalreporter._sessionstarttime 会话开始时间</em></span>

  74. <span style="color:#98c379">'total times'</span>: timestamp() - terminalreporter._sessionstarttime

  75. }

  76. <span style="color:#7171bf">print</span>(result)

  77. <span style="color:#7171bf">if</span> result[<span style="color:#98c379">'failed'</span>] <span style="color:#7171bf">or</span> result[<span style="color:#98c379">'error'</span>]:

  78. send_report()

  79. <span style="color:#7171bf">def</span> <span style="color:#61aeee">_capture_screenshot</span>():

  80. <span style="color:#98c379">"""截图保存为base64"""</span>

  81. now_time, screen_file = cm.screen_path

  82. driver.save_screenshot(screen_file)

  83. allure.attach.file(screen_file,

  84. <span style="color:#98c379">"失败截图{}"</span>.<span style="color:#7171bf">format</span>(now_time),

  85. allure.attachment_type.PNG)

  86. <span style="color:#7171bf">with</span> <span style="color:#7171bf">open</span>(screen_file, <span style="color:#98c379">'rb'</span>) <span style="color:#7171bf">as</span> f:

  87. imagebase64 = base64.b64encode(f.read())

  88. <span style="color:#7171bf">return</span> imagebase64.decode()

  89. </code></span></span>

来看看我们修改了什么:

  • 我们修改了_capture_screenshot函数

在里面我们使用了webdriver截图生成文件,并使用allure.attach.file方法将文件添加到了allure测试报告中。

并且我们还返回了图片的base64编码,这样可以让pytest-html的错误截图和allure都能生效。

运行一次得到两份报告,一份是简单的一份是好看内容丰富的。

现在我们在测试用例中构建一个预期的错误测试一个我们的这个代码。


修改test_002测试用例

  1. <span style="color:#596172"><span style="background-color:#ffffff"><code class="language-python"> <span style="color:#7171bf">assert</span> <span style="color:#7171bf">not</span> <span style="color:#7171bf">all</span>([<span style="color:#98c379">"selenium"</span> <span style="color:#7171bf">in</span> i <span style="color:#7171bf">for</span> i <span style="color:#7171bf">in</span> search.imagine])

  2. </code></span></span>

运行一下:

可以看到allure报告中已经有了这个错误的信息。

再来看看pytest-html中生成的报告:

可以看到两份生成的报告都附带了错误的截图,真是鱼和熊掌可以兼得呢。

好了,到这里可以说allure的报告就先到这里了,以后发现allure其他的精彩之处我再来分享。

总结:

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

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

这份文档,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

以上均可以分享,只需要你搜索vx公众号:程序员雨果,即可免费领取

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/658722.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

k8s的operator基石:controller-runtime源码解析

写在之前 今天开始开更controller-runtime的源码阅读&#xff0c;笔者建议大家在阅读前了解以下知识&#xff0c;可能会帮助大家更好的理解源码逻辑。 1.client-go的基础使用 2. 使用kubebuilder搭建一个简单的controller-runtime环境 3.informer的基本思想 1.源码环境搭建 参…

代理模式(静态代理、JDK 动态代理、CGLIB 动态代理)

代理模式(静态代理、JDK 动态代理、CGLIB 动态代理) 一、代理模式概述1. 生活中的代理案例2. 为什么要使用代理3. 代理模式在 Java 中的应用4. 概述5. 生活中代理图示二、代理的实现方式1. Java 中代理图示2. 静态代理2.1 案例2.2 实现案例2.3 静态代理存在的问题三、动态代理…

SpringBoot的默认组件扫描

本篇博客主要探究&#xff1a;为什么SpringBoot项目中我们没有配置组件扫描的包&#xff0c;为什么它会默认扫描启动类所在的包&#xff1f; 一、访问与启动类所在同一包下的接口 我们先来看一个简单的接口&#xff1a; 我们可以观察到&#xff0c;HelloController这个类处在…

福布斯财富增长榜前十富豪身价暴增3.5万亿!他们致富的秘诀究竟是?

按照《福布斯》最新的数据显示&#xff0c;今年全球前十位财富增长最多的富豪的身家总共增加了4900亿美元&#xff08;约3.5万人民币&#xff09;&#xff0c;大家可能对于3.5万亿没什么概念&#xff0c;但是换算一下&#xff0c;中国一共才14亿人&#xff0c;如果把这3.5万亿平…

jenkins部署(docker)

docker部署&#xff0c;避免安装tomcat 1.拉镜像 docker pull jenkins/jenkins2.宿主机创建文件夹 mkdir -p /lzp/jenkins_home chmod 777 /lzp/jenkins_home/3.启动容器 docker run -d -p 49001:8080 -p 49000:50000 --privilegedtrue -v /lzp/jenkins_home:/var/jenkins_…

BUUCTF-Real-[PHP]XXE

目录 1、原理 2、XXE漏洞产生的原因 3、开始复现 paylaod 复现 4、flag 1、原理 XML数据在传输过程中&#xff0c;攻击者强制XML解析器去访问攻击者指定的资源内容&#xff08;本地/远程&#xff09;&#xff0c;外部实体声明关键字SYSTEM会令XML解析器读取数据&#xf…

【Axure教程0基础入门】00Axure9汉化版下载、安装、汉化、注册+01制作线框图

写在前面&#xff1a;在哔哩哔哩上面找到的Axure自学教程0基础入门课程&#xff0c;播放量最高&#xff0c;5个多小时。课程主要分为4个部分&#xff0c;快速入门、动态面板、常用动效、项目设计。UP主账号【Song老师产品经理课堂】。做个有素质的白嫖er&#xff0c;一键三连必…

【C/C++】深入理解--函数重载(什么是函数重载?为什么要有函数重载?)

目录 一、前言 二、 函数重载 &#x1f34e;什么是函数重载 &#x1f350;函数重载的条件 &#x1f347;函数重载的注意点 &#x1f349;为什么要有函数重载 &#x1f353;为何C语言不支持函数重载&#xff0c;反倒C可以&#xff1f; &#x1f4a6; Linux环境下演示函数重…

Cocos creator 动作系统

动作系统简介 是用于控制物体运动的一套系统&#xff0c;完全依赖代码进行实现&#xff0c;动态调节节点的移动。 移动 cc.moveTo 移动到某个坐标&#xff08;x,y&#xff09; //1秒时间内&#xff0c;移动到0,0let action1 cc.moveTo(1,0,0)this.node.runAction(action1)c…

基于单片机的烟草干燥温度控制系统设计

摘 要&#xff1a;烟草干燥研究一直备受国内外烟草工作者的重视&#xff0c;在烟草干燥的方法中热风管处理法是利用热空气对流使烟草达到干燥的效果&#xff0c;这样可以控制烟草干燥时的温度&#xff0c;使烟草能够更好更快地干燥&#xff0c;因此温度的检测和控制是很重要的。…

写静态页面——浮动练习

0、效果&#xff1a; 1、html代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>浮动…

C++-类和对象(2)

目录 5.类的作用域 6.类的实例化 7.类对象模型 7.1 如何计算类对象的大小 7.2 类对象的存储方式猜测 1.对象中包含类的各个成员 ​编辑 2.代码只保存一份&#xff0c;在对象中保存存放代码的地址 ​编辑 3.只保存成员变量&#xff0c;成员函数存放在公共的代码段 ​编辑…

C++进阶(八)红黑树

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、红黑树的概念二、红黑树的性质三、红黑树结构四、红黑树的插入操作1、情况一2、情况二3、…

【C++】构造函数和析构函数详解

目录 前言 类中的六个默认成员函数 构造函数 概念 特性 析构函数 概念 特性&#xff1a; 前言 类中的六个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编…

【Cookie反爬虫】某采购网站动态Cookie加点选验证码校验分析与实战

文章目录 1. 写在前面2. 请求分析3. JS反混淆4. 深度分析 【作者主页】&#xff1a;吴秋霖 【作者介绍】&#xff1a;Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作&#xff01; 【作者推荐】&#xff1a;对JS逆向感兴趣的朋…

字符串转换const char* , char*,QByteArray,QString,string相互转换,支持中文

文章目录 1.char * 与 const char * 的转换2.QByteArray 与 char* 的转换3.QString 与 QByteArray 的转换4.QString 与 string 的转换5.QString与const string 的转换6.QString 与 char* 的转换 在开发中&#xff0c;经常会遇到需要将数据类型进行转换的情况&#xff0c;下面依…

【C++入门到精通】特殊类的设计 | 单例模式 [ C++入门 ]

阅读导航 引言一、设计模式概念&#xff08;了解&#xff09;二、单例模式1. 饿汉模式&#xff08;1&#xff09;概念&#xff08;2&#xff09;模拟实现&#xff08;3&#xff09;优缺点&#xff08;4&#xff09;适用场景 2. 懒汉模式&#xff08;1&#xff09;概念&#xff…

金田金业教你如何看懂国际黄金价格走势图

对于黄金投资者来说&#xff0c;看懂国际黄金价格走势图是至关重要的。通过观察走势图&#xff0c;可以了解金价的实时动态&#xff0c;预测未来的走势&#xff0c;从而做出相应的投资决策。本文将详细解析如何看懂国际黄金价格走势图。 一、国际黄金价格走势图的基本构成 国…

【JavaEE】UDP协议与TCP协议

作者主页&#xff1a;paper jie_博客 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文于《JavaEE》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白精心打造的。笔者用重金(时间和精力)打造&…

NoSQL数据库简介

NoSQL数据库简介 Brief Introduction to NoSQL Databases By JacksonML 1. 什么是SQL&#xff1f; 在了解NoSQL之前&#xff0c;先简要介绍一下SQL。 SQL是 Structured Query Language&#xff08;结构化查询语言&#xff09;的缩写。 SQL在关系型数据中广泛使用&#xf…