python - 在 unittest 中测试性能
问题描述
我有一个专门的字符串处理方法,我想要测试,所以我可以很容易地检查它是否正常工作。
我已经使用 unittest 编写了几个测试结果的正确性,我对结果感到满意。我的工作流程是在 PyCharm 中使用命令“Run Unittests in [FOLDER]”,然后将结果导出为 HTML。
我使用的算法有点复杂,所以我想确保我不会不小心让它变得不合理地低效。所以我也想要一个检查这个的测试。但是,测试通常应该有一个客观的通过/失败结果——所以我不确定如何实施我的性能检查。
我找到了一个简单的基准:我看到我的函数处理字符串需要多长时间,并将其与需要多长时间string.split()
进行比较。当然这两种方法都太快了,所以我运行了几千次。由于这两种都是字符串处理方法,我认为这种比较作为第一个近似值是合理的。然后我创建了一个测试方法,它将我的方法的运行时间比为split
,并检查它是否不超过 1000。“在库函数的 3 个数量级内”对我来说似乎“足够接近” ,所以我现在可以正常工作了。
但是,很高兴知道该比率实际上是多少。例如,如果我重写了修复错误的方法,但它最终运行速度变慢了两倍,这是我有兴趣知道的(即使它仍然满足我的“3 个数量级”的要求)。我想要的是 HTML 测试报告显示实际测量结果以及通过/失败,以便我可以手动检查它并决定是否需要进一步关注(即使它通过了)。HTML 报告已经显示了给定测试的运行时间,但这不仅包括我的函数的运行时间,还包括基准函数和与我正在测量的内容无关的各种设置/拆卸(函数运行速度有多快通过字符串)。
那么,如何在我的 HTML 测试报告中包含任意测量值?
- 我知道我可以编写一个脚本来运行并计时,但我不知道如何使它适合我的一键式测试设置(嗯,实际上是 2 次单击 - 一次运行测试,一次将结果导出到 HTML )。
- 我知道衡量性能的方法是分析代码,但我还没有找到与我的工作流程兼容的分析器。我希望将性能测量作为测试电池的一部分进行,而不是作为需要我采取额外行动的事情。
解决方案
这可能有点晚了,但为了完整起见......
您可以做的一件简单的事情是使用timeit
python 模块并在您的测试中使用它来评估性能。然后你可以使用返回的值timeit
并添加一行看起来像
self.assertLess(timer_value, performance_threshold)
您可以让您的性能阈值也成为从您执行的一组给定字符串计算的计时器值string.split(" ")
,您可以在单元测试中以一种廉价的方式即时计算它,或者提前计算它并保存时间值,如果随着时间的推移,您的测试不会发生太大变化。如果您的计算时间过长,您将获得测试失败,因为该计时器值将大于您设置的阈值。
我不知道unittest
模块中有任何计时功能,但你已经可以用time
andtimeit
模块做很多事情了。这家伙玩了一点,所以也许你可以读一读。
希望有帮助,
推荐阅读
- angular - 如何使用 Ionic 在 CKEditor 5 中设置高度?
- javascript - 如何在不使用 JSON 打开浏览器选项卡的情况下使用“mailto”属性?
- sql - 数字到日期转换
- android - admob 请求和印象的巨大差异,我的代码放置错误吗?
- node.js - 升级 node 版本不会影响之前的 node js 项目
- java - 使用 Google 表格/Google Drive API 请求特定文件权限
- regex - VBA RegEx 第二场比赛从第一场比赛开始
- javascript - 使用jquery获取tr中所选td的ID
- javascript - setState() 没有正确更新我的状态
- python - python selenium 使用 ActiveX 打开 InternetExplorer