如何正确排序unittest TestCases?

例如,我希望它们按照它们在文件中出现的顺序运行。

import unittest

class Test_MyTests(unittest.TestCase):

    def test_run_me_first(self): pass
    def test_2nd_run_me(self):   pass
    def test_and_me_last(self):  pass

class Test_AnotherClass(unittest.TestCase):

    def test_first(self):        pass
    def test_after_first(self):  pass
    def test_de_last_ding(self): pass

if __name__ == "__main__":
    unittest.main(verbosity=2)

运行这个给

test_after_first (__main__.Test_AnotherClass) ... ok
test_de_last_ding (__main__.Test_AnotherClass) ... ok
test_first (__main__.Test_AnotherClass) ... ok
test_2nd_run_me (__main__.Test_MyTests) ... ok
test_and_me_last (__main__.Test_MyTests) ... ok
test_run_me_first (__main__.Test_MyTests) ... ok

不是我想要的

我在搜索所有跳舞并通过调用/分组测试或说出这些问题后在SO上找到的答案

  • “不要这样做,只是用不同的方式编写测试”或

  • “按字典顺序命名测试!”

...除了一个,它可以满足我的要求:

loader = unittest.TestLoader()
ln = lambda f: getattr(MyTestCase, f).im_func.func_code.co_firstlineno
lncmp = lambda a, b: cmp(ln(a), ln(b))
loader.sortTestMethodsUsing = lncmp
unittest.main(testLoader=loader, verbosity=2)

但仅适用于一个TestCase类,并且仅适用于Python 2。

我想运行所有的Python 3unittest.TestCase子类,并且希望能够指定用于排序的确切算法。

我可以在里面做unittest吗?

做了之后很多的研究,由SO和Python的大大的资助,help而不是在所有的单元测试的文档,我得到的答案最初想,所以我想我会写这篇文章,以帮助别人,因为这是一个公平的(但显然通用) 要求。


要运行特定的测试用例,我们需要TestSuite为该TestCase新建一个让我们对任意数量的TestCases进行以下操作:

def suiteFactory(*testcases):

    ln    = lambda f: getattr(tc, f).__code__.co_firstlineno
    lncmp = lambda a, b: ln(a) - ln(b)

    test_suite = unittest.TestSuite()
    for tc in testcases:
        test_suite.addTest(unittest.makeSuite(tc, sortUsing=lncmp))

    return test_suite

非常简单:

  1. 定义函数以获取函数的行号。在Python 3中,我们将属性从更改func.im_func.func_code.co_firstlinenofunc.__code__.co_firstlineno,您可以使用查看dir(anyFunction)

  2. 定义一个函数,以根据两个参数cmp的行号对它们进行排序cmp出于“人们可以做数学”的考虑,Python 3中没有使用它,因此出于可读性的考虑,我所做的正是它所做的。

  3. 制作一个new空白TestSuite(),并给它一个TestCase或十个,然后告诉它使用第二点对TestCase的方法进行排序:cmp输入它们的行号。


现在我们需要对文件的TestCase子类进行排序。

为此,我们可以查看globals()和及其属性。

def caseFactory():

    from inspect import findsource

    g = globals().copy()

    cases = [
        g[obj] for obj in g
            if obj.startswith("Test")
            and issubclass(g[obj], unittest.TestCase)
    ]

    ordered_cases = sorted(cases, key=lambda f: findsource(f)[1])

    return ordered_cases

这只会得到unittest.TestCaseTest或任何您喜欢的命名约定开头的所有子类,然后按行号对它们进行排序:findsource(object)返回源代码,并将行号作为索引1,这是我们关心的。


要将其包装成某种东西,我们可以使用:

if __name__ == "__main__":
    cases = suiteFactory(*caseFactory())
    runner = unittest.TextTestRunner(verbosity=2)
    runner.run(cases)

确实分隔了输出,但是如果最低级别的测试位于文件的顶部(或底部,或某处),并且应该更高级别的测试之前运行可能是一件好事

因此,完整的输出为:

test_run_me_first (__main__.Test_MyTests) ... ok
test_2nd_run_me (__main__.Test_MyTests) ... ok
test_and_me_last (__main__.Test_MyTests) ... ok
test_first (__main__.Test_AnotherClass) ... ok
test_after_first (__main__.Test_AnotherClass) ... ok
test_de_last_ding (__main__.Test_AnotherClass) ... ok

----------------------------------------------------------------------
Ran 6 tests in 0.000s

OK

成功!


您可以在Github gist上找到更有趣的版本

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在nunit TestCases中使用元组?

来自分类Dev

Hackerrank TestCases不正确?Dijkstra最短到达2

来自分类Dev

为什么不能unittest.TestCases看到我的py.test装置?

来自分类Dev

无法通过SDK正确检索TestCases集合,而只能通过Web Service api正确检索

来自分类Dev

如何概括Rally上下文以包括来自与TestSet相关的不同项目的TestCases

来自分类Dev

删除所有与TestSet相关的TestCases

来自分类Dev

TestCases无法看到新的编译文件-Eclipse

来自分类Dev

如何正确对该方法进行UnitTest?

来自分类Dev

如何正确进行聚合排序?

来自分类Dev

QTimer与超时方法的连接在TestCases(Python)中不起作用

来自分类Dev

SoapUI 循环通过 TestCases 并记录测试用例自定义属性

来自分类Dev

在运行TestCases时,Hibernate JPA Transaction无效错误,但在主类中执行时可以正常工作

来自分类Dev

如何与分组依据汇总并正确排序

来自分类Dev

如何使咖喱合并排序正确通用

来自分类Dev

Python lambda排序函数如何正确编码?

来自分类Dev

如何与分组依据汇总并正确排序

来自分类Dev

如何正确排序多索引熊猫DataFrame

来自分类Dev

如何正确排序我的jQuery输出?

来自分类Dev

如何正确排序轴上的标签?

来自分类Dev

如何使用js正确排序项目

来自分类Dev

我如何正确实施快速排序?

来自分类Dev

如何获得快速排序的分区以产生正确的预期输出?

来自分类Dev

如何通过phpMyAdmin导入日期和价格,然后正确排序?

来自分类Dev

如何获取拉丁扩展字符在Parse上正确排序

来自分类Dev

如何在python排序列表中获得正确的结果

来自分类Dev

如何以正确的方式对字典列表进行排序

来自分类Dev

如何以正确的顺序对DICOM切片进行排序?

来自分类Dev

如何在SQL中正确对财务年度季度进行排序?

来自分类Dev

如何选择我的Cassandra键进行正确的默认排序?

Related 相关文章

  1. 1

    如何在nunit TestCases中使用元组?

  2. 2

    Hackerrank TestCases不正确?Dijkstra最短到达2

  3. 3

    为什么不能unittest.TestCases看到我的py.test装置?

  4. 4

    无法通过SDK正确检索TestCases集合,而只能通过Web Service api正确检索

  5. 5

    如何概括Rally上下文以包括来自与TestSet相关的不同项目的TestCases

  6. 6

    删除所有与TestSet相关的TestCases

  7. 7

    TestCases无法看到新的编译文件-Eclipse

  8. 8

    如何正确对该方法进行UnitTest?

  9. 9

    如何正确进行聚合排序?

  10. 10

    QTimer与超时方法的连接在TestCases(Python)中不起作用

  11. 11

    SoapUI 循环通过 TestCases 并记录测试用例自定义属性

  12. 12

    在运行TestCases时,Hibernate JPA Transaction无效错误,但在主类中执行时可以正常工作

  13. 13

    如何与分组依据汇总并正确排序

  14. 14

    如何使咖喱合并排序正确通用

  15. 15

    Python lambda排序函数如何正确编码?

  16. 16

    如何与分组依据汇总并正确排序

  17. 17

    如何正确排序多索引熊猫DataFrame

  18. 18

    如何正确排序我的jQuery输出?

  19. 19

    如何正确排序轴上的标签?

  20. 20

    如何使用js正确排序项目

  21. 21

    我如何正确实施快速排序?

  22. 22

    如何获得快速排序的分区以产生正确的预期输出?

  23. 23

    如何通过phpMyAdmin导入日期和价格,然后正确排序?

  24. 24

    如何获取拉丁扩展字符在Parse上正确排序

  25. 25

    如何在python排序列表中获得正确的结果

  26. 26

    如何以正确的方式对字典列表进行排序

  27. 27

    如何以正确的顺序对DICOM切片进行排序?

  28. 28

    如何在SQL中正确对财务年度季度进行排序?

  29. 29

    如何选择我的Cassandra键进行正确的默认排序?

热门标签

归档