首页 > 解决方案 > python unittest.assertEqual - 如何在 x 秒后终止?

问题描述

我是一个重度、重度、使用差异化测试方法的用户,所以我倾向于将复杂的多行文本字符串提供给unittest.assertEqual. 这种类型的典型使用是提供一大块 html,我通常会用它进行预处理beautifulsoup.prettify

我发现,当字符串足够大足够不同时,assertEqual将花费大量时间,或者根本不返回。如果我ctrl-c这个过程,我经常会发现它被打断了difflib.py。有时,需要pkill -laf 'ython.+test'在另一个终端中使用。

这是一种简单的 Python 方法,我可以在概念上执行:

unittest.assertEqual(a,b, timeout=5)

这意味着5 秒后,终止并告诉我它们不相等,您无法获得更多详细信息

当然,我假设如果我传入assertEqual.msg参数,该函数将不会调用 difflib.py。有趣的是,虽然diff命令行实用程序通常会在不到一秒的时间内返回结果,但不太聪明的差异,如 macOS 上的 Kaleidoscope,通常也会挂在这些差异上。

理想情况下,https://pypi.org/project/func-timeout/会做我想要的。但它是 LGPL,所以不是我的 MIT 应用程序的选项。

我已经有一些类似的基于线程的代码func_timeout,用于在适当的延迟后终止 SQL 连接尝试。我想我可以用那个。我还可以启动 asubprocess.popen(diff,..., timeout=5)来调用操作系统的 native diff,因为我的字符串通常也会保存到文件中。

在我看来,这是一个推动 assertEqual 的人经常遇到的问题,所以想知道人们采取了哪些方法。

标签: pythonunit-testingdiffterminate

解决方案


unittest.assertTrue(a == b, "strings not equal")您可以通过使用which 避免使用 diff来解决整个问题。


推荐阅读