Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python unittest不会注意到您是否意外地复制了一个测试_Python_Python Unittest - Fatal编程技术网

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强调了为什么应该这样做。很高兴知道为什么不,它是否应该是主观的。我个人认为应该考虑到测试是关于覆盖率的,确保没有任何东西能够通过间隙,如果它捕捉到一个非常可能的错误,这会掩盖测试是否在做任何事情,这将是一件好事。