首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python单元测试中对象的长定义

Python单元测试中对象的长定义
EN

Stack Overflow用户
提问于 2012-08-27 09:14:33
回答 2查看 520关注 0票数 7

我正在测试我的申请。大多数测试所做的是调用带有特定参数的函数,并断言返回值与期望值相等。

在一些测试中,预期返回值是一个相对较大的对象。例如,其中一个是字典,它将5个字符串映射到元组列表。定义该对象需要40-50行重复代码,但该对象是我正在测试的函数之一的期望值。我不希望有40-50行代码在测试函数中定义预期的返回值,因为我的大多数测试函数由3-6行代码组成。我正在寻找这样的情况下的最佳实践。在测试中放置冗长定义的正确方法是什么?

下面是我想要解决这个问题的想法,从最好的到最坏的,我认为是这样的:

  • 测试对象的示例:基于键的子集做出一些相等的断言。为了代码优雅,这将牺牲测试的彻底性。
  • 在一个单独的模块中定义对象:在一个单独的.py文件中编写40至50行代码,然后在测试中导入该模块,然后做出相等的断言。这将使测试简短,但我不喜欢使用单独的文件作为测试的补充;毕竟,对象定义是测试的一部分。
  • 在测试函数中定义对象:--这是我希望避免的琐碎解决方案。我的测试非常简单,而且该对象的冗长定义也不适合。

也许我太沉迷于干净的代码,但我不喜欢上述任何一个解决方案。还有什么我没想过的常见做法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-27 10:20:21

我建议使用测试代码和测试数据的分离。出于这个原因,我通常创建一个抽象基类,其中包含我想要测试的方法,并创建几个特定的测试用例类来将方法绑定到数据上。(我使用Django框架,所以我将所有抽象测试类放入testbase.py中):

testbase.py

代码语言:javascript
复制
class TestSomeFeature(unittest.TestCase):
    test_data_A = ...

    def test_A(self):
        ... #perform test

现在是test.py中的实现

代码语言:javascript
复制
class TestSomeFeatureWithDataXY(testbase.TestSomeFeature):
    test_data_A = XY

测试数据也可以外部化,例如JSON文件:

代码语言:javascript
复制
class TestSomeFeatureWithDataXYZ(testbase.TestSomeFeature):
    @property
    def test_data_A(self): 
        return json.load("data/XYZ.json")

我希望我已经说得够清楚了。在您的例子中,我强烈选择使用数据文件。Django通过在执行任何测试之前使用要加载到数据库中的测试夹具来支持这种开箱即用的方法。

票数 3
EN

Stack Overflow用户

发布于 2012-08-27 10:38:50

这取决于你想测试什么。

如果您想测试字典是否包含某些带有特定值的键,那么我将建议单独的断言来检查每个键。这样,如果扩展了字典,那么测试仍然是有效的,并且测试失败应该清楚地识别问题(一个错误消息告诉您,一个50行长的字典不等于第二个50行长的字典,这是不清楚的)。

如果您确实想验证字典中只包含给定的键,那么一个断言可能是合适的。定义您要比较的对象,并将其与最清楚的对象进行比较。如果在一个单独的文件中定义它(正如Constantinius的答案所建议的那样),那么请考虑这样做。

在这两种情况下,指导原则是只测试你关心的行为。如果您测试您不关心的行为,您可能会发现您的测试套件在重构时更具有阻碍性,而不是有帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12139167

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档