Python unittest不会注意到您是否意外地复制了一个测试
如果我修改了文档中的测试,并且无意中复制了一个测试:Python unittest不会注意到您是否意外地复制了一个测试,python,python-unittest,Python,Python Unittest,如果我修改了文档中的测试,并且无意中复制了一个测试: import unittest class TestStringMethods(unittest.TestCase): def test_upper(self): self.assertEqual('foo'.upper(), 'FOO') def test_isupper(self): self.assertTrue('FOO'.isupper()) self.asser
import unittest
class TestStringMethods(unittest.TestCase):
def test_upper(self):
self.assertEqual('foo'.upper(), 'FOO')
def test_isupper(self):
self.assertTrue('FOO'.isupper())
self.assertFalse('Foo'.isupper())
def test_isupper(self):
self.assertTrue('FOO'.isupper())
self.assertFalse('Foo'.isupper())
def test_split(self):
s = 'hello world'
self.assertEqual(s.split(), ['hello', 'world'])
# check that s.split fails when the separator is not a string
with self.assertRaises(TypeError):
s.split(2)
if __name__ == '__main__':
unittest.main()
它返回的内容与未复制的内容完全相同:
python3 basictest.py
...
----------------------------------------------------------------------
Ran 3 tests in 0.001s
OK
如果更改其中一个重复测试使其失败,则失败将显示或不显示,具体取决于您修改的重复测试。所以我在写测试的时候无意中做到了这一点,而这些测试只是彼此略有不同。如果您在一个程序中这样做,它们不仅彼此相邻,而且位于脚本的两端,该怎么办。如果您有重复的测试,为什么它不警告您 在这样定义的类中不可能检测到重复项。如您所见,当刚通过元类创建类时,已经选择了一个重复函数:
class Meta(type):
def __new__(cls, name, bases, namespace):
print(name, namespace)
return super().__new__(cls, name, bases, namespace)
class Dupe(metaclass=Meta):
def a(self):
...
def a(self):
...
这将产生:
Dupe {'__module__': '__main__', '__qualname__': 'Dupe', 'a': <function Dupe.a at 0x8f5be84>}
如果您想检测重复,您需要将每个函数包装在一个装饰器中,让它决定某个特定函数是否是重复的。如何做出此决定是另一个问题:例如,您可以跟踪已定义函数的所有名称,然后只需检查列表中是否已存在给定函数的名称。在这样定义的类中不可能检测到重复项。如您所见,当刚通过元类创建类时,已经选择了一个重复函数:
class Meta(type):
def __new__(cls, name, bases, namespace):
print(name, namespace)
return super().__new__(cls, name, bases, namespace)
class Dupe(metaclass=Meta):
def a(self):
...
def a(self):
...
这将产生:
Dupe {'__module__': '__main__', '__qualname__': 'Dupe', 'a': <function Dupe.a at 0x8f5be84>}
如果您想检测重复,您需要将每个函数包装在一个装饰器中,让它决定某个特定函数是否是重复的。如何做出此决定是另一个问题:例如,您可以跟踪已定义函数的所有名称,然后只需检查列表中是否已存在给定函数的名称。为什么要警告您?更重要的是,这怎么可能呢?Unittest类与任何其他类没有区别;与任何其他类一样,它们将属性(包括方法)存储在dict中。与任何dict一样,如果您使用相同的键分配两个值,那么其中一个值将覆盖另一个值它为什么要警告您?更重要的是,这怎么可能呢?Unittest类与任何其他类没有区别;与任何其他类一样,它们将属性(包括方法)存储在dict中。与任何dict一样,如果您使用相同的键分配两个值,一个值将覆盖另一个值谢谢,这在技术上是不可能的,因为它是为警告您而编写的。你似乎在说他们本可以付出额外的努力,这样它就会警告你,而他们却没有这样做@DanielRoseman强调了为什么应该这样做。很高兴知道为什么不,它是否应该是主观的。我个人认为应该考虑到测试是关于覆盖率的,确保没有任何东西能够通过间隙,如果它捕捉到一个非常可能的错误,这会掩盖测试是否在做任何事情,这将是很好的。谢谢,这在技术上是不可能的,因为它是为警告您而编写的。你似乎在说他们本可以付出额外的努力,这样它就会警告你,而他们却没有这样做@DanielRoseman强调了为什么应该这样做。很高兴知道为什么不,它是否应该是主观的。我个人认为应该考虑到测试是关于覆盖率的,确保没有任何东西能够通过间隙,如果它捕捉到一个非常可能的错误,这会掩盖测试是否在做任何事情,这将是一件好事。