【发布时间】:2018-09-24 02:46:40
【问题描述】:
我完全意识到单元测试的顺序并不重要。但是这些单元测试与实际单元测试一样用于教学用途,所以我希望测试输出与测试用例源代码相匹配。
我看到有一种方法可以通过在测试加载器上设置sortTestMethodsUsing 属性来设置排序顺序。默认是一个简单的cmp() 调用,以词法比较名称。所以我尝试编写一个类似于cmp 的函数,该函数将采用两个名称,找到它们的声明行号并返回它们的cmp()-等价物:
import unittest
class TestCaseB(unittest.TestCase):
def test(self):
print("running test case B")
class TestCaseA(unittest.TestCase):
def test(self):
print("running test case A")
import inspect
def get_decl_line_no(cls_name):
cls = globals()[cls_name]
return inspect.getsourcelines(cls)[1]
def sgn(x):
return -1 if x < 0 else 1 if x > 0 else 0
def cmp_class_names_by_decl_order(cls_a, cls_b):
a = get_decl_line_no(cls_a)
b = get_decl_line_no(cls_b)
return sgn(a - b)
unittest.defaultTestLoader.sortTestMethodsUsing = cmp_class_names_by_decl_order
unittest.main()
当我运行它时,我得到这个输出:
running test case A
.running test case B
.
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK
表示测试用例没有按照声明顺序运行。
我的排序函数没有被调用,所以我怀疑 main() 正在构建一个新的测试加载器,它正在清除我的排序函数。
【问题讨论】:
-
你能提供一个minimal reproducible example 来证明你的问题吗?您发布的代码不包含任何测试,因此不需要对任何测试进行排序。
-
(如果这是你运行的代码,那么这就是你的答案:它没有排序任何东西,因为没有什么要排序。)
-
顺便说一句,我猜这是一个 Python2 项目,对吧?因为 Python3 中没有
cmp。 -
实际上它是一个库模块,试图保持与 Py2.6 到 3.latest 的兼容性。我忘记了 Py3 不再有
cmp()- 感谢您的关注。 -
而here 是一个相关的答案,如果您真的想对类而不是方法进行排序,我认为它可能会对您有所帮助。
标签: python python-3.x python-unittest