python - 如何测试设置和检查依赖于未经测试的方法的方法?

标签 python unit-testing

我创建了一个示例类(一个位掩码类),它有 4 个非常简单的函数。我还为这个类(class)创建了一个单元测试。

import unittest

class BitMask:

    def __init__(self):
        self.__mask = 0

    def set(self, slot):
        self.__mask |= (1 << slot)

    def remove(self, slot):
        self.__mask &= ~(1 << slot)

    def has(self, slot):
        return (self.__mask >> slot) & 1

    def clear(self):
        self.__mask = 0


class TestBitmask(unittest.TestCase):

    def setUp(self):
        self.bitmask = BitMask()

    def test_set_on_valid_input(self):
        self.bitmask.set(5)
        self.assertEqual(self.bitmask.has(5), True)

    def test_has_on_valid_input(self):
        self.bitmask.set(5)
        self.assertEqual(self.bitmask.has(5), True)

    def test_remove_on_valid_input(self):
        self.bitmask.set(5)
        self.bitmask.remove(5)
        self.assertEqual(self.bitmask.has(5), False)

    def test_clear(self):
        for i in range(16):
            self.bitmask.set(i)
        self.bitmask.clear()
        for j in range(16):
            with self.subTest(j=j):
                self.assertEqual(self.bitmask.has(j), False)

我面临的问题是,所有这些测试都需要 sethas 方法来设置和检查位掩码中的值,但这些方法未经测试。在不知道其中一个正确的情况下,我无法确认另一个正确。

这个示例类并不是我第一次遇到这个问题。当我需要设置和检查类中的值/状态以测试方法时,通常会发生这种情况。

我试图找到解释这一点的资源,但不幸的是他们的例子只是 use pure functions或者更改的属性可以是 read directly 。我可以通过将方法提取为纯函数或使用返回属性 __mask 的只读属性来解决该问题。

但这是首选方法吗?如果没有,我如何测试需要使用未经测试的方法设置和/或检查的方法?

最佳答案

不确定这是否能回答您的问题,因为它涉及初始类设计的更改, 但事情就这样了。

您创建了一个没有构造函数或属性的惰性类,它隐藏了您的状态 目的。这不是未经测试的 sethas 方法,而是以下问题 物体的状态未知。您是否有要透露的 .value 属性 self.__mask,这将解决测试.set()和has()的问题。

此外,我强烈考虑在构造函数中使用默认值,这使得它看起来更好 实例化并允许更轻松的测试(关于避免在 python is here 中 setter 的一些建议)。

def __init__(self, mask=0):
    self.__mask = mask

如果有任何设计考虑因素阻止您拥有 .value 属性, 如果 __init__ 接受一个值,也许可以使用 __eq__ 方法。

 a = BitMask(0)     
 b = BitMask(5)     
 a.set(5)
 assert a == b     

当然,您可以质疑 __eq__ 本身是如何测试的。

最后,也许您在修补猴子修补方面失败了 - a 阻止被测对象内部某些内容或使其以不同方式工作的技术 (例如,在没有实际调用的情况下模仿网络响应)。使用任何用于路径追踪的库 我认为你最终仍然会执行一种某种 x.__mask = value 赋值,这 对于像这里这样的小型、漂亮且本地定义的类来说不太合理。

希望它对您正在探索的内容有所帮助。

关于python - 如何测试设置和检查依赖于未经测试的方法的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50898709/

相关文章:

python - 使用对象作为字典键

python - 按列索引重命名 csv 中的列

android - 为 Presenter 的私有(private)方法编写单元测试

python - 如何测试不同格式的日期和日期时间?

javascript - 在对显示模块进行单元测试时如何 stub 私有(private)函数

python - 使用vobject在django-python中解析vcf文件

python - Xlsxwriter 中有 csv.DictWriter 吗?

python - 调试时深入研究变量

javascript - 监视 jQuery $ ('...' ) Jasmine 中的选择器

ruby - 在 Ruby 中对 protected 和私有(private)方法进行单元测试的最佳方法是什么?