Pytest-Austin:无指令插入的性能回归测试

2020-10-23 03:46:59

Pytest-Austin插件将Python性能测试直接带入您的CI管道。它使用奥斯汀来分析您的测试运行,而不需要任何检测。您所要做的就是简单地标记要对其执行检查以防止性能倒退的测试。

任何失败的测试都将在会话结束时由pytest报告。所有收集到的统计数据都写在一个前缀为ASTIN_的文件中,后跟一个截断的时间戳,位于pytest rootdir内。您可以将其放到SpeedScope上,以便快速直观地表示您的测试。

====测试会话启动====platform Linux--Python3.6.9,pytest-6.0.1,py-1.9.0,Pluggy-0.13.1--/home/gabriele/.cache/pypoetry/virtualenvs/pytest-austin-yu27Ep_e-py3.6/bin/python3.6cachedir:.pytest_cacherootdir:/tmp/pytest-of-gabriele/pytest-226/test_austin_time_checks0plugins:cov-2.10.0,奥斯汀-0.1.0收集...。已收集3项stest_austin_time_checks.py::TEST_LINES PASSEDtest_austin_time_checks.py::test_check_fails PASSEDtest_austin_time_checks.py::test_check_succeeds PASSED=Austin Report=austin 2.0.0收集写入/tmp/pytest-of-gabriele/pytest-226/test_austin_time_checks0/.austin_97148135487643.aprof🕑采样时间的统计信息(最小/平均/最大):376/3327/18019μ的🐢长采样率:87/87(100.00)个样本。花费的时间超过采样间隔💀错误率:0/87(0.00%)无效样本TEST_ASTIN_TIME_CHECKs.py::TEST_LINES TEST_LINES:19(TEST_ASTIN_TIME_CHECKS.py)-16.0毫秒(-78.2%,共20.5ms)TEST_ASTIN_TIME_CHECKS.py::TEST_LINES TEST_LINES:18(TEST_奥斯汀_TIME_CHECKs.py)-4.1ms(-10.1%,共40.3毫秒)TEST_奥斯汀_。Time_checks.py::TEST_LINES斐波那契(TEST_ASTIN_TIME_CHECKs.py)-9.3ms(-18.6%,共50 ms)test_austin_time_checks.py::test_check_fails TEST_CHECK_FAILES(TEST_奥斯汀_TIME_CHECKs.py))+99.8ms(1000.0μs)test_austin_time_checks.py::test_check_succeeds TEST_CHECK_SUCCESS(TEST_奥斯汀_TIME_CHECKS.py)的9978.6)。-9.0 ms(110.0 ms)=1检查失败=3在0.35s=中通过的-8.1%.。

注为了使插件正常工作,Austin二进制文件需要位于PATH环境变量中。请参阅Austin安装说明,了解如何在您的平台上轻松安装Austin。

安装后,该插件将尝试将Austin附加到pytest进程,以便在您每次运行pytest时对其进行采样。如果你想阻止奥斯汀分析你的测试,你必须偷走它的魔力。可以使用--steal-mojo命令行参数执行此操作。

该插件在收集的测试项目上查找TOTAL_TIME标记,该标记需要一个强制参数时间和三个可选参数时间:函数、模块和行。

如果您只是想检查测试项目的持续时间不会超过时间,您可以用@pytest.mark.total_time(Time)标记它。这里,timeca可以是一个浮点型(以秒为单位),也可以是datetime.timeDelta的一个实例。

在某些情况下,您可能希望确保在测试脚本的某一行上调用的函数或方法在一定的时间内执行,比如总测试时间的5%。你可以像这样做到这一点

导入pytest@pytest。马克。TOTAL_TIME(";5%";,line=7)def test_hello_default():ome function()fast function()#<;-这是测试脚本中的第7行某一其他函数()。

然而,在许多情况下,人们会想要测试测试直接或间接调用的函数或方法的运行时间是否不超过一定的总时间。这就是TOTAL_TESTMARK的剩余参数发挥作用的地方。假设您想要分析由Snafu类型的对象的foo方法调用的过程栏。要确保BAR花费的时间不会超过总测试持续时间的50%,您可以这样写。

可以使用模块参数来解决函数名冲突。例如,如果函数/方法栏的定义出现在模块Somemodule.py和某个其他模块e.py中,但您只对Somemodule.py中定义的模块感兴趣,则可以将上述内容更改为。

虽然您还可以指定行号,但这在测试脚本本身之外可能不是很方便和实用,除非模块的内容足够稳定,行号不需要频繁更新。

在本例中,负数(如-16.0毫秒)表示TEST_LINES:19(test_austin_time_checks.py)上花费的总时间比TOTAL_TIME标记指定的总允许时间(在本例中为20.5毫秒)少16.0毫秒。因此,负数表示检查成功。

这表示TEST_CHECK_FAIES(test_austin_time_checks.py)花费的总时间比所需阈值(设置为1毫秒)多99.8毫秒。

可以使用TOTAL_MEMORY标记执行内存分配检查。第一个参数是大小,它可以是标记的测试用例的总内存分配的百分比,也可以是最大内存量的绝对度量,例如,24MB";。函数、模块和行与TOTAL_TIME标记相同。可以将额外的net参数设置为True,以检查总的净内存使用量,即内存分配和释放之间的差异。

为了执行内存检查,您需要通过--profile-mode选项指定内存或所有配置文件模式。

报告中插件报告的负内存增量和正内存增量的行为类似于上一节中描述的时间增量。也就是说,负值内存增量表示检查成功,而正值表示检查失败。

在All Profile模式下,您可以使用TOTAL_TIME和TOTAL_MEMORY标记执行时间和内存检查。

如果您的测试产生了其他Python进程,您可以使用--mini选项要求pytest-austin也对它们进行概要分析。请注意,如果您的测试产生了许多非Python进程,那么采样率可能会因为Austin试图发现Python子进程的方式而受到影响。

此插件生成有关终端的报告,并将收集到的分析统计数据转储到文件系统,以供以后分析和可视化。可以使用--austin-report选项控制终端报告的详细程度。默认情况下,它设置为最小,这意味着只报告失败的检查。使用Full查看插件检测到并执行的所有检查的结果。

关于性能分析统计数据的转储,默认情况下生成的文件是Austin格式(这是折叠堆栈格式的推广)。如果您希望插件以pprof或speedscope格式转储数据,您可以相应地设置--profile-format选项。

这个插件已经在Linux、MacOS和Windows上进行了测试。鉴于它依赖于奥斯汀对pytest进程的帧堆栈进行采样,其兼容性考虑因素也适用于pytest-奥斯汀。

在Linux上,需要使用sudo,除非向Austin二进制文件授予CAP_SYS_PTRACE功能,例如。

然后,不再需要使用sudo来允许奥斯汀附加和采样pytest。

在MacOS上,除非调用pytest的用户属于procmod组,否则也必须使用sudo。

如果你喜欢最热的奥斯汀,而且你觉得它很有用,有很多方法可以让你做出贡献。

如果您想帮助开发,那么在您打开Pull请求之前,先看一看公开的问题,并看一看有助于开发的指导方针。

你也可以通过成为asonsor和/或给我买一杯BMC咖啡,或者在PayPal.me上捐几便士,来为最火爆的奥斯汀的发展做出贡献。