珠海正规网站制作排名费用多少,秀米h5页面怎么制作,沈阳企业网站建设,wordpress通过电子邮件前言 用例执行完成后#xff0c;我们希望能获取到执行的结果#xff0c;这样方便我们快速统计用例的执行情况。 也可以把获取到的结果当成总结报告#xff0c;发邮件的时候可以先统计测试结果#xff0c;再加上html的报告。
pytest_terminal_summary 关于TerminalReporter…前言 用例执行完成后我们希望能获取到执行的结果这样方便我们快速统计用例的执行情况。 也可以把获取到的结果当成总结报告发邮件的时候可以先统计测试结果再加上html的报告。
pytest_terminal_summary 关于TerminalReporter类可以在_pytest.terminal中查看到 pytest_terminal_summary(terminalreporter, exitstatus, config)
最后的结果汇总,可以拿到所有的执行结果
参数
- terminalreporter (_pytest.terminal.TerminalReporter) – 内部使用的终端测试报告对象
- exitstatus (int) – 返回给操作系统的返回码
- config(_pytest.config.Config) - pytest config对象
TerminalReporter部分代码
class TerminalReporter(object):def __init__(self, config, fileNone):import _pytest.configself.config configself._numcollected 0self._session Noneself._showfspath Noneself.stats {}self.startdir config.invocation_dirdef report_collect(self, finalFalse):if self.config.option.verbose 0:returnif not final:# Only write collecting report every 0.5s.t time.time()if (self._collect_report_last_write is not Noneand self._collect_report_last_write t - REPORT_COLLECTING_RESOLUTION):returnself._collect_report_last_write terrors len(self.stats.get(error, []))skipped len(self.stats.get(skipped, []))deselected len(self.stats.get(deselected, []))selected self._numcollected - errors - skipped - deselectedif final:line collected else:line collecting line (str(self._numcollected) item ( if self._numcollected 1 else s))if errors:line / %d errors % errorsif deselected:line / %d deselected % deselectedif skipped:line / %d skipped % skippedif self._numcollected selected 0:line / %d selected % selectedif self.isatty:self.rewrite(line, boldTrue, eraseTrue)if final:self.write(\n)else:self.write_line(line)
案例参考
先在test_a.py写几个用例
# test_a.py
import pytest
# 上海-悠悠def test_1():print(测试用例1111)assert 1 1pytest.mark.skip(跳过)
def test_2():print(测试用例22222)assert 1 1def test_3():print(测试用例3333)def test_4():print(测试用例44444444)assert 1 2
test_b.py用例参考
# test_b.py
import time
# 上海-悠悠def test_5():print(测试用例55555555)time.sleep(3)def test_6():print(测试用例66666666)time.sleep(3)assert 1 2
于是在conftest.py中写个 pytest_terminal_summary 函数收集测试结果
import time
# 上海-悠悠def pytest_terminal_summary(terminalreporter, exitstatus, config):收集测试结果print(terminalreporter.stats)print(total:, terminalreporter._numcollected)print(passed:, len(terminalreporter.stats.get(passed, [])))print(failed:, len(terminalreporter.stats.get(failed, [])))print(error:, len(terminalreporter.stats.get(error, [])))print(skipped:, len(terminalreporter.stats.get(skipped, [])))# terminalreporter._sessionstarttime 会话开始时间duration time.time() - terminalreporter._sessionstarttimeprint(total times:, duration, seconds)
运行结果
D:\soft\pytest_xuexi_demopytesttest session starts
platform win32 -- Python 3.6.0, pytest-4.5.0, py-1.5.4, pluggy-0.13.1
rootdir: D:\soft\pytest_xuexi_demo
plugins: allure-pytest-2.8.6, PyTestReport-0.1.9.3, forked-0.2, html-1.19.0, metadata-1.7.0, repeat-0.7.0, rerunfailures-8.0, xdist-1.23.2
collected 6 itemstest_a.py .s.F [ 66%]
test_b.py .F [100%] FAILURES
___________________________________ test_4 ____________________________________def test_4():print(测试用例44444444)assert 12
E assert 1 2test_a.py:21: AssertionError
---------------------------- Captured stdout call -----------------------------
测试用例44444444
___________________________________ test_6 ____________________________________def test_6():print(测试用例66666666)time.sleep(3)assert 1 2
E assert 1 2test_b.py:18: AssertionError
---------------------------- Captured stdout call -----------------------------
测试用例66666666
{: [TestReport test_a.py::test_1 whensetup outcomepassed, TestReport test_a.py::test_1 whenteardown outcomepassed, TestReport test_a.py::test_2 whenteardown outcomepassed, TestReport test_a.py::test_3 whensetup outcomepassed, TestReport test_a.py::test_3 whenteardown outcomepassed, TestReport test_a.py::test_4 whensetup outcomepassed, TestReport test_a.py::test_4 whenteardown outcomepassed, TestReport test_b.py::test_5 whensetup outcomepassed, TestReport test_b.py::test_5 whenteardown outcomepassed, TestReport test_b.py::test_6 whensetup outcomepassed, TestReport test_b.py::test_6 whenteardown outcomepassed], passed: [TestReport test_a.py::test_1 whencall outcomepassed, TestReport test_a.py::test_3 whencall outcomepassed, TestReport test_b.py::test_5 whencall outcomepassed], skipped: [TestReport test_a.py::test_2 whensetup outcomeskipped], failed: [TestReport test_a.py::test_4 whencall outcomefailed, TestReport test_b.py::test_6 whencall outcomefailed]}
total: 6
passed: 3
failed: 2
error: 0
skipped: 1
total times: 6.150860786437988 seconds2 failed, 3 passed, 1 skipped in 6.15 seconds
setup和teardown异常情况
如果setup出现异常test_b.py代码修改下
# test_b.py
import time
import pytest
# 上海-悠悠pytest.fixture(scopefunction)
def setup_demo():raise TypeError(ERROR!)def test_5(setup_demo):print(测试用例55555555)time.sleep(3)def test_6():print(测试用例66666666)time.sleep(3)assert 1 2
重新运行用例,结果如下
total: 6
passed: 2
failed: 2
error: 1
skipped: 1
成功率33.33%
total times: 3.1817877292633057 seconds2 failed, 2 passed, 1 skipped, 1 error in 3.18 seconds
此时统计结果没什么问题接下来看teardown异常情况
# test_b.py
import time
import pytest
# 上海-悠悠pytest.fixture(scopefunction)
def setup_demo():yield raise TypeError(ERROR!)def test_5(setup_demo):print(测试用例55555555)time.sleep(3)def test_6():print(测试用例66666666)time.sleep(3)assert 1 2
运行结果
{: [TestReport test_a.py::test_1 whensetup outcomepassed, TestReport test_a.py::test_1 whenteardown outcomepassed, TestReport test_a.py::test_2 whenteardown outcomepassed, TestReport test_a.py::test_3 whensetup outcomepassed, TestReport test_a.py::test_3 whenteardown outcomepassed, TestReport test_a.py::test_4 whensetup outcomepassed, TestReport test_a.py::test_4 whenteardown outcomepassed, TestReport test_b.py::test_5 whensetup outcomepassed, TestReport test_b.py::test_6 whensetup outcomepassed, TestReport test_b.py::test_6 whenteardown outcomepassed], passed: [TestReport test_a.py::test_1 whencall outcomepassed, TestReport test_a.py::test_3 whencall outcomepassed, TestReport test_b.py::test_5 whencall outcomepassed], skipped: [TestReport test_a.py::test_2 whensetup outcomeskipped], failed: [TestReport test_a.py::test_4 whencall outcomefailed, TestReport test_b.py::test_6 whencall outcomefailed], error: [TestReport test_b.py::test_5 whenteardown outcomefailed]}
total: 6
passed: 3
failed: 2
error: 1
skipped: 1
成功率50.00%
total times: 6.18759298324585 seconds2 failed, 3 passed, 1 skipped, 1 error in 6.19 seconds
这个时候总用例是6但是2 failed, 3 passed, 1 skipped, 1 error加起来的个数是7这个为什么
从 terminalreporter.stats 可以看出 passed 里面 whencall 时候统计了一次 test_5 用例
TestReport test_b.py::test_5 whencall outcomepassederror 里面 whenteardown 又统计了一次 test_5 用例
error: [TestReport test_b.py::test_5 whenteardown outcomefailed]whenteardown 是测试用例的后置操作一般用于数据的清理报错了的话不影响测试用例的执行结果所以可以忽略掉
修改后的最终代码如下
import time
# 上海-悠悠def pytest_terminal_summary(terminalreporter, exitstatus, config):收集测试结果# print(terminalreporter.stats)print(total:, terminalreporter._numcollected)print(passed:, len([i for i in terminalreporter.stats.get(passed, []) if i.when ! teardown]))print(failed:, len([i for i in terminalreporter.stats.get(failed, []) if i.when ! teardown]))print(error:, len([i for i in terminalreporter.stats.get(error, []) if i.when ! teardown]))print(skipped:, len([i for i in terminalreporter.stats.get(skipped, []) if i.when ! teardown]))print(成功率%.2f % (len(terminalreporter.stats.get(passed, []))/terminalreporter._numcollected*100)%)# terminalreporter._sessionstarttime 会话开始时间duration time.time() - terminalreporter._sessionstarttimeprint(total times:, duration, seconds)
运行后的结果
total: 6
passed: 3
failed: 2
error: 0
skipped: 1
成功率50.00%
total times: 6.20133113861084 seconds2 failed, 3 passed, 1 skipped, 1 error in 6.20 seconds
拿到测试结果
很多小伙伴问到如何拿到测试结果这里我把测试结果保存为txt文件你们也可以保存json文件
import time
# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/def pytest_terminal_summary(terminalreporter, exitstatus, config):收集测试结果# print(terminalreporter.stats)total terminalreporter._numcollectedpassed len([i for i in terminalreporter.stats.get(passed, []) if i.when ! teardown])failedlen([i for i in terminalreporter.stats.get(failed, []) if i.when ! teardown])errorlen([i for i in terminalreporter.stats.get(error, []) if i.when ! teardown])skippedlen([i for i in terminalreporter.stats.get(skipped, []) if i.when ! teardown])successful len(terminalreporter.stats.get(passed, []))/terminalreporter._numcollected*100# terminalreporter._sessionstarttime 会话开始时间duration time.time() - terminalreporter._sessionstarttimeprint(total times: %.2f % duration, seconds)with open(result.txt, w) as fp:fp.write(TOTAL%s % total\n)fp.write(PASSED%s % passed\n)fp.write(FAILED%s % failed\n)fp.write(ERROR%s % error\n)fp.write(SKIPPED%s % skipped\n)fp.write(SUCCESSFUL%.2f%% % successful\n)fp.write(TOTAL_TIMES%.2fs % duration)
邮件发送
总结
感谢每一个认真阅读我文章的人
作为一位过来人也是希望大家少走一些弯路如果你不想再体验一次学习时找不到资料没人解答问题坚持几天便放弃的感受的话在这里我给大家分享一些自动化测试的学习资源希望能给你前进的路上带来帮助。 软件测试面试文档
我们学习必然是为了找到高薪的工作下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料并且有字节大佬给出了权威的解答刷完这一套面试资料相信大家都能找到满意的工作。 文档获取方式
加入我的软件测试交流群822269834免费获取~同行大佬一起学术交流每晚都有大佬直播分享技术知识点
这份文档对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库这个仓库也陪伴我走过了最艰难的路程希望也能帮助到你 以上均可以分享只需要你搜索vx公众号程序员雨果即可免费领取
相关文章: