本文系《pytest源码剖析》系列内容
17. pastebin
插件路径:_pytest.pastebin
pastebin 指的是在线剪切板,将内容粘贴后会得到一个 URL,
将这个 URL 分享给其他人之后,即可得到你粘贴的内容,
便于大段文字的分享传输
实现的 hook
调用的 hook
无
定义的 fixture
无
插件功能
创建命令行参数--pastebin
failed:只发送失败信息
all:发送完整的终端结果
pytest 执行结束时,向 pastebin 发送信息
代码片段
@pytest.hookimpl(trylast=True)def pytest_configure(config: Config) -> None: if config.option.pastebin == "all": tr = config.pluginmanager.getplugin("terminalreporter") if tr is not None: config.stash[pastebinfile_key] = tempfile.TemporaryFile("w+b") oldwrite = tr._tw.write
def tee_write(s, **kwargs): ...
tr._tw.write = tee_write
def create_new_paste(contents: Union[str, bytes]) -> str: import re from urllib.request import urlopen from urllib.parse import urlencode
def pytest_terminal_summary(terminalreporter: TerminalReporter) -> None: if terminalreporter.config.option.pastebin != "failed": return if "failed" in terminalreporter.stats: terminalreporter.write_sep("=", "Sending information to Paste Service") for rep in terminalreporter.stats["failed"]:
通过修改插件terminalreporter,备份全部的输出
使用标准库urllib发送 HTTP 请求,减少了第三方依赖
如果传递了参数--pastebin failed
会为每一个失败的用例创建单独的 URL
简评
pytest 使用的 pastebin 服务商是 https://bpa.st/
国内速度一般,但好歹能够访问
...
为了获得更详细的信息,可以考虑使用参数
pytest -vvs --pastebin all
如果内容太多,长度超过 pastebin 服务商限制,改为
pytest -vvs --pastebin failed
只为失败的用例粘贴内容
每一个用例独立粘贴
...
此插件功能非常简单,整体设计却非常优雅:
通过 hookpytest_configure来修改插件,轻松的获取到全部内容
通过 hookpytest_terminal_summary精准的只获取失败用例的信息,
不仅可以避免获取到其他内容,而且自动将各用例分开
如果是从全部内容提取失败信息,分离各个用例,怕是要麻烦许多
领取专属 10元无门槛券
私享最新 技术干货