测试的顺序可以在python 2上完美运行,但不能在python 3上完美运行

时间:2019-10-10 12:47:55

标签: python python-unittest

我正在使用单元编写我的测试用例。据我了解,默认情况下,unittest按字母顺序处理测试类中的测试类和测试方法(即使loader.sortTestMethodsUsing为None时)。因此,我找到了一些解决方案here,它确实可以在python 2上正常工作。当我尝试在python 3上运行此解决方案时,出现错误NameError: name 'cmp' is not defined,因此我找到了有关如何解决此问题的答案here。我在另一个文件中创建函数,然后导入cmp()。但是我仍然无法订购测试,我也不知道为什么。

  

cmp_f.py

def cmp(a, b):
    return (a > b) - (a < b)
  

test_f.py

import unittest
from cmp_f import cmp


class Login(unittest.TestCase):

    def test_remove_notes_and_reports(self):
        print("1")

    def test_login_app(self):
        print("2")

    def test_report_summary_after_edit(self):
        print("3")

    def test_report_summary(self):
        print("4")


if __name__ == "__main__":
    loader = unittest.TestLoader()
    ln = lambda f: getattr(Login, 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)

1 个答案:

答案 0 :(得分:2)

出现此问题的原因是,在Py3k中,现在在类上查找函数会产生原始函数,而不是未绑定的方法。在Py2中:

class Foo(object):
    def bar(self):
       pass

type(Foo.bar)
<type 'instancemethod'>

在Python3中

class Foo:
    def bar(self):
        pass

type(Foo.bar)
<class 'function'>

因此解决方案非常简单:您只需要.im_func部分。此外,function.func_code现在被命名为function.__code__。因此,您需要类似(caveat:未经测试的代码)的内容:

ln = lambda f: getattr(Login, f).__code__.co_firstlineno

FWIW,您可以按照我的方式自行调试:检查Python Shell中的内容(花了我大约2分钟的时间才能找到xD)。