首页 > 解决方案 > 在 unittest 中测试性能

问题描述

我有一个专门的字符串处理方法,我想要测试,所以我可以很容易地检查它是否正常工作。

我已经使用 unittest 编写了几个测试结果的正确性,我对结果感到满意。我的工作流程是在 PyCharm 中使用命令“Run Unittests in [FOLDER]”,然后将结果导出为 HTML。

我使用的算法有点复杂,所以我想确保我不会不小心让它变得不合理地低效。所以我也想要一个检查这个的测试。但是,测试通常应该有一个客观的通过/失败结果——所以我不确定如何实施我的性能检查。

我找到了一个简单的基准:我看到我的函数处理字符串需要多长时间,并将其与需要多长时间string.split()进行比较。当然这两种方法都太快了,所以我运行了几千次。由于这两种都是字符串处理方法,我认为这种比较作为第一个近似值是合理的。然后我创建了一个测试方法,它将我的方法的运行时间比为split,并检查它是否不超过 1000。“在库函数的 3 个数量级内”对我来说似乎“足够接近” ,所以我现在可以正常工作了。

但是,很高兴知道该比率实际上是多少。例如,如果我重写了修复错误的方法,但它最终运行速度变慢了两倍,这是我有兴趣知道的(即使它仍然满足我的“3 个数量级”的要求)。我想要的是 HTML 测试报告显示实际测量结果以及通过/失败,以便我可以手动检查它并决定是否需要进一步关注(即使它通过了)。HTML 报告已经显示了给定测试的运行时间,但这不仅包括我的函数的运行时间,还包括基准函数和与我正在测量的内容无关的各种设置/拆卸(函数运行速度有多快通过字符串)。

那么,如何在我的 HTML 测试报告中包含任意测量值?

标签: pythonperformancepycharmworkflowpython-unittest

解决方案


这可能有点晚了,但为了完整起见......

您可以做的一件简单的事情是使用timeitpython 模块并在您的测试中使用它来评估性能。然后你可以使用返回的值timeit并添加一行看起来像

self.assertLess(timer_value, performance_threshold)

您可以让您的性能阈值也成为从您执行的一组给定字符串计算的计时器值string.split(" "),您可以在单元测试中以一种廉价的方式即时计算它,或者提前计算它并保存时间值,如果随着时间的推移,您的测试不会发生太大变化。如果您的计算时间过长,您将获得测试失败,因为该计时器值将大于您设置的阈值。

我不知道unittest模块中有任何计时功能,但你已经可以用timeandtimeit模块做很多事情了。这家伙玩了一点,所以也许你可以读一读。

希望有帮助,


推荐阅读