【问题标题】:How should I unit test this我应该如何对此进行单元测试
【发布时间】:2012-04-03 17:52:47
【问题描述】:

我有一个有 15 个成员的实体。有各种类型的成员应用了各种规则,有些允许空值,有些则不允许。这是数据库实体:

tbl_items(
item_id bigint identity(1,1) not null primary key,
item_category bigint null foreign key references tbl_categories(category_id) on delete set null,
item_model nvarchar(50) not null,
item_brand nvarchar(50) not null,
item_color nvarchar(20) not null,
item_made_in nvarchar(20) null,
item_desc nvarchar(100) null,
item_price decimal not null,
item_image varbinary(max) null,
item_monetary_unit nvarchar(10) not null,
item_rating int null,
item_date datetime not null,
item_quantity int not null
)

对数据条目可能具有的所有状态进行单元测试将使我的单元测试类 (ItemTest) 拥有超过 1000 行代码。那么我需要为每个数据状态写一个测试方法吗?还是我应该只考虑编写测试方法的无效状态?就像在属性不可为空时设置为空一样。

【问题讨论】:

  • 当您说“对所有状态进行单元测试”时,您的意思是什么?要测试的显而易见的事情是向表提供随机值以查看它是否保持水。 PK 和 FK 测试同样重要。更清楚您的问题将有助于我们更好地理解它。
  • id 可能是空字符串、字符串、负数、零、大于 bigint 大小。你应该为这些状态中的每一个编写测试方法吗?

标签: sql database unit-testing testing entity


【解决方案1】:

如果您使用的是 NUnit 或类似的东西,有两个概念可以帮助您:

  1. 测试用例允许您将参数传递给已分解的测试方法:http://nunit.org/?p=testCase&r=2.5
  2. Test Theories 允许您自动创建所有可能的输入。警告:这些可能会导致运行速度非常慢的测试,因此请谨慎使用。 http://nunit.org/index.php?p=theory&r=2.5

就您应该对什么进行单元测试而言,该问题的答案差异很大。有些人在控制器层编写跨层验收测试。有些人会模拟所有依赖项并编写独立的单元测试。你必须看看你和你的团队想要做什么,并尝试不同的策略。就个人而言,对于您所描述的情况,我会为您的验证功能编写一个通用测试。然后,为所有真正不同的案例编写一个 TestCase。

【讨论】:

  • 感谢真的很有帮助,但是我应该对什么进行单元测试?映射?验证?业务规则?
  • 用我对此的看法更新了答案,但答案确实因团队和项目而异
【解决方案2】:

您到底在测试什么?如果您正在测试从对象到数据库的映射,我会编写一个测试来证明我可以插入数据,以便对象中的值最终出现在正确的数据库字段中,然后退出。

【讨论】:

  • 我刚刚开始单元测试。我应该对映射、验证和业务规则进行单元测试吗?我的意思是你应该对“一切”进行单元测试吗?如果是,那将花费大量时间,并且在编写代码方面会使项目规模扩大三倍。
  • 理想情况下应该针对您的单元测试中的业务规则。这为您提供了更多的 IMO 价值。
  • @Raj:是的。因为他一直在讨论空值,所以我认为一定没有要测试的业务逻辑,否则他会这样做。
猜你喜欢
  • 1970-01-01
  • 2020-11-06
  • 2013-07-16
  • 1970-01-01
  • 1970-01-01
  • 2016-09-18
  • 2011-01-01
  • 2017-04-30
  • 1970-01-01
相关资源
最近更新 更多