如何对Python单元测试发现的测试进行排序?

8

我使用Python的unittest格式创建了一组Python测试。

现在我可以使用以下命令运行它们:

python -m unittest discover -s TestDirectory -p '*.py' -v

我找到它们所有的内容,并运行它们。

现在,无论是在Windows还是Linux上运行测试都有微妙的差别。实际上,在Windows上测试按字母顺序运行,而在Linux上测试没有人类特定发现顺序,即使总是相同的。

问题在于我依赖于测试文件的前两个字母来对测试执行的顺序进行排序。并不是要按照特定顺序运行它们,而是为了让一些带有版本数据信息的测试以某种“信息性”的方式出现在测试运行日志中。

是否有办法在Linux上也按字母顺序运行测试呢?


你尝试过使用nosetests吗?我想知道直接运行nosetests是否会有所不同。我不使用unittest中的discover,因为nosetests可以很好地完成这项工作。你试过了吗? - CppLearner
刚试了一下,在Linux上测试好像是有序的。谢谢。但我想避免强制开发人员安装nose,而是使用集成的unittest来进行纯Python测试。 - Didier Trosset
当我在Linux下运行单元测试时,它们按以下顺序排序:首先按文件或目录名称排序,再按类名排序,最后按测试(方法)名称排序。问题是,在运行测试时,只显示测试名称,这仅是最后一个子排序,并且没有任何逻辑排序。我只想确认您明显的无序是上述文件/目录 - 类 - 方法排序? - user707650
测试用例是按照 os.listdir 返回它们的顺序被发现的,这不是确定性的。他们已经在 Python 3.2+ 中修复了这个问题,但这并不能帮助我们大多数人,但你可以使用 monkey patch 同样的更改来解决这个问题。http://bugs.python.org/issue16709 - Roger Binns
1个回答

0

我没有尝试过这个,但我想你可以重写TestSuite类以添加一个排序函数。然后在调用unittest运行函数之前,您可以调用排序函数。因此,在一个名为“ AllTests.py”的脚本中,您可以添加以下内容:

class SortableSuite(unittest.TestSuite):
    def sort(self):
        self._tests.sort(cmp=lambda x,y: x._testMethodName < y._testMethodName)
    def run(self,testResult):
        #or if you don't want to run a sort() function, you can override the run
        #function to automatically sort.
        self._tests.sort(cmp=lambda x,y: x._testMethodName < y._testMethodName)
        return unittest.TestSuite.run(self,testResult)

loader = unittest.TestLoader()
loader.suiteClass = SortableSuite
suite = loader.loadTestFromTestCases(collectedTests)
suite.sort()
suite.run(defaultTestResult())

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接