在这个单元测试中检查这么多东西有什么问题吗?:
ActualModel = ActualResult.AssertViewRendered() // check 1
.ForView("Index") // check 2
.WithViewData<List<Page>>(); // check 3
CollectionAssert.AreEqual(Expected, ActualModel); // check 4
Run Code Online (Sandbox Code Playgroud)
此测试的主要目标是验证返回正确的视图(检查2)并且它包含正确的数据(检查4).
我可以通过将其分成多个测试来获得任何收益吗?我一切都是为了做正确的事情,但如果它没有实际价值我就不会分手了.
我对单元测试很陌生,所以请保持温和.
假设我想编写一个用正则表达式验证电子邮件地址的函数.我写了一个小测试来检查我的功能并编写实际的功能.让它通过.
但是,我可以提出一些不同的方法来测试相同的功能(test@test.com; test234@test.com; test.test.com等).
我是否将所需的所有咒语都用几个ASSERTS进行相同的单一测试,或者为我能想到的每一件事写一个新的测试?
谢谢!
我刚刚读完了Roy Osherove的"单元测试艺术",我正在努力坚持他在书中列出的最佳实践.其中一个最佳实践是不在测试方法中使用多个断言.这个规则的原因对我来说相当清楚,但它让我怀疑......
如果我有一个像这样的方法:
public Foo MakeFoo(int x, int y, int z)
{
Foo f = new Foo();
f.X = x;
f.Y = y;
f.Z = z;
return f;
}
Run Code Online (Sandbox Code Playgroud)
我是否真的必须编写单独的单元测试以声明Foo的每个单独属性是否使用提供的值进行初始化?在测试方法中使用多个断言真的很少见吗?
仅供参考:我正在使用MSTest.
编辑:感谢所有的回复.我想我最终将继续使用多个断言.在我的情况下,正在测试的行为是MakeFoo制作一个合适的Foo.因此断言每个属性都达到预期值就足够了.但是,如果设置其中一个属性存在条件,那么我将分别测试每个单独的结果.
我仍然不喜欢它....我喜欢每次测试一个断言的想法是你知道测试失败的确切原因.如果您解决了问题,那么测试将通过.有多个断言,您没有相同的保证.如果你修复了失败的断言所提到的问题,那么在测试中的下一次失败就没有什么可以阻止另一个断言了.如果断言被分开,那么你从一开始就知道两个失败.
最后,我不仅仅使用.Equals()的原因是因为在我的情况下,Foo是一个LINQ-To-SQL实体,它引入了一些不值得进入的并发症.
再次感谢.
我有一个DTO,我从请求对象填充,请求对象有很多字段.我想编写一个测试来检查populateDTO()方法是否将值放在正确的位置.如果我遵循每个测试一个断言的规则,我将不得不编写大量测试来测试每个字段.另一种方法是在单个测试中编写多个断言.是否真的建议每个测试规则遵循一个断言,或者我们可以在这些情况下放松.我该如何处理这个问题?
每个测试有多个断言是非常难闻的气味?我通常会尝试遵循"排列,行为,断言"模式以及每个测试指南的单个断言.我认为干净,小巧,孤立的测试是非常棒的.在大多数情况下,我设法做到这一点.然而,有时我会发现自己在我的安排之后立即声称"先决条件":
'arrange:
'pre-conditions:
Assert the arrange worked
'act:
'assert:
Run Code Online (Sandbox Code Playgroud)
我的测试测试太多了吗?是否关心它不应该关心的事情?我很乐意听到一些意见.
我正在使用Rubberduck对我的VBA实现进行单元测试.当Assert.IsTrue在一个TestMethod中使用相同类型的多个Assert(例如)时,测试结果并没有告诉我哪个失败,据我所见.
有没有办法找出哪个Assert失败或者这是在Rubberduck未来路线图上?当然我可以添加自己的信息,例如Debug.Print在每个Assert之前使用,但这会导致很多额外的代码.
我知道在一次测试中对于多个Assert有不同的看法,但我选择在我的情况下使用它们,这个讨论已经在其他地方讨论过了 .
如果您正在测试类似下面的计数函数,那么在一个函数中为函数测试多个东西而不是为每个测试都测试函数,它被认为是"正确"还是"错误"?
function testGetKeywordCount() {
$tester = $this -> getDatabaseTester($this -> CompleteDataFile);
$tester -> onSetUp();
$KeywordID = 0;
$this -> setExpectedException('InvalidArgumentException');
$this -> keyword -> getKeywordCount($KeywordID,'Active');
$KeywordID = 1;
$this -> setExpectedException('InvalidArgumentException');
$this -> keyword -> getKeywordCount($KeywordID,'InvalidStatus');
$this -> assertEquals(1, $this -> keyword -> getKeywordCount($KeywordID,'Active'));
$tester -> onTearDown();
}
Run Code Online (Sandbox Code Playgroud) unit-testing ×7
mstest ×2
tdd ×2
testing ×2
assert ×1
assertions ×1
c# ×1
correctness ×1
junit ×1
nunit ×1
php ×1
rubberduck ×1
vba ×1
vbe ×1