<分区> 分区>
我在一份新工作中开始了一个新项目。这是我第一次大量使用 Python。与我必须在静态类型语言中跳过的箍相比,模拟是一种全新的野兽。我亲自调查了团队的单元测试,并希望将其中一些从使用 Dingus 升级到 Mock。
今天早些时候,我遇到了一些正在检查转换类的测试。具体来说,它将十六进制数字字符串转换为 Mongo ObjectIds(唯一标识符)。我希望看到的是一个验证给定有效十六进制数的测试,将返回具有相同十六进制数的 ObjectId - 或者 - 如果给定一个错误的十六进制数,则会发生错误。相反,测试验证的所有内容都是创建并返回了 ObjectId。事实上,ObjectId 和十六进制数都被完全模拟了!
现在,从字符串创建 ObjectId 不需要连接到服务器或任何东西。一切都在本地运行。
我向我的新同事询问了这个特定的测试套件。他们的想法是,应该使用集成测试验证实际转换并作为单元测试,单元测试应该做的就是确保代码按预期从上到下流动,并创建并返回 ObjectId。因此,基本上,测试仅验证此类以预期方式与环境交互。
我已经编写单元测试很长时间了。根据我的经验,我根本不会使用模拟,我只会验证转换是否按预期发生。这意味着与来自另一个模块的 ObjectId 类进行交互。也许我对单元测试的想法太笼统了。我一直保留用于连接到远程服务器、文件和诸如此类的东西的集成测试。
在我看来,在此示例中使用 ObjectId 与使用 str 或 list 没有什么不同。当然,我可以模拟 str 和 list,但由于它们对我的代码所做的事情至关重要,因此在我看来模拟它们并没有多大意义。我唯一应该关心与依赖项交互的时间是它可以改变测试结果的时候。
编写仅检查代码流的单元测试是否有值(value)?单元测试不应该是验证代码的行为/正确性的结果吗?
