Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.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/ant/2.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测试类的正确方法是什么?_Python_Python 3.x_Unit Testing_Testing_Python Unittest - Fatal编程技术网

用Python测试类的正确方法是什么?

用Python测试类的正确方法是什么?,python,python-3.x,unit-testing,testing,python-unittest,Python,Python 3.x,Unit Testing,Testing,Python Unittest,有一个名为State的类,它有几个属性,我需要为这些属性编写单元测试。测试将需要某些操作来更改状态实例的属性值。预期参数位于字典内部。单元测试将比较状态实例的属性与字典的值是否相等 问题是什么是保持比较逻辑的最佳位置?我 当时正在考虑两种选择: 将\uuuu eq\uuu方法添加到包含比较逻辑的状态类中 在包含比较逻辑的测试模块内部添加helper函数 哪一个选项更好?为什么?您可能应该采用\uuuu eq\uuu方法。这样,如果需要,您还可以在将来测试实际代码中的相等性,同时如果您计划或可能在

有一个名为
State
的类,它有几个属性,我需要为这些属性编写单元测试。测试将需要某些操作来更改
状态
实例的属性值。预期参数位于字典内部。单元测试将比较
状态
实例的属性与字典的值是否相等

问题是什么是保持比较逻辑的最佳位置?我 当时正在考虑两种选择:

  • \uuuu eq\uuu
    方法添加到包含比较逻辑的
    状态
    类中
  • 在包含比较逻辑的测试模块内部添加helper函数

  • 哪一个选项更好?为什么?

    您可能应该采用
    \uuuu eq\uuu
    方法。这样,如果需要,您还可以在将来测试实际代码中的相等性,同时如果您计划或可能在将来使用类型注释,还可以避免导入helper函数时可能出现的混乱情况

    通常,您不希望您的测试代码包含太多的逻辑,因为测试意味着测试代码,而不是实现更多可能需要自己测试的逻辑。除了实际的测试功能之外,测试套件应该非常简单


    我认为不采用这种方法的唯一原因是,如果您正在测试的类有一些独特的用例,其中
    \uuuueq\uuuu
    是不适用的,并且您希望避免实现一个这样的用例,从而可能使您自己或以后的开发人员感到困惑。

    <代码>\uuuu eq\uuuu在大多数情况下不应用于将特定对象与dict进行比较并给出相等值。预期的行为是在相同(或继承)类型的对象之间进行比较。如果您正在寻找一种与
    状态
    对象进行比较的方法,它可能会很有用——但根据您的描述,这里的情况似乎并非如此

    如果这些测试没有显式地测试相等性,而是测试某些属性,我也会小心地在特定测试中使用
    \uuuuu eq\uuuu
    \uuuuu eq\uuuuuu
    -即同一类对象之间的比较要求的未来变化可能与您在测试中实际测试的内容不具有相同的语义含义。例如未来对
    \uuuu eq\uuuu
    的更改可能会引入比测试要求更多的相似性要求(例如,它们实际上是相同的对象,而不仅仅是相似的)。由于
    \uuuu eq\uuuu
    的预期行为是“这表示完全相同的事情”,这可能与您正在测试的内容不同

    将比较放在你的类之外——如果你想在不同的上下文中重复使用它,可以将它作为一个实用函数添加到你的项目中,也可以将它作为一个特定的函数添加到你的对象中。现在,我只想在测试中保留它,然后在必要时将它移动到项目中

    这一切都假定比较是简单的。如果涉及实际逻辑和计算,则不属于测试。相反,将逻辑添加到类中,以正确的可测试格式直接公开值


    测试应该只检查返回的值是否与预期值匹配。但是,将返回的dict与该dict的预期值进行比较是完全有效的。

    我想说,如果您认为
    \uuuuuueq\uuuuuuu
    的按值实现无论如何都是您希望在代码中实现的,那么就这样做。否则,最好避免向生产代码中添加仅用于测试的内容。在测试文件中添加一个助手函数,以进行所需的比较。不过,我在准确地设想您要做的事情时遇到了一点困难,所以也许一个代码示例可以帮助您澄清问题。