我有一个班级Stats
,里面有几个方法。像:
public int getAmountOfTimesAPlayerLogedIn(string playerName)
public int getHighestScoreInLeague ( string leagueName )
public int getTopPlayers ( string leagueName, int topResults )
当我为这个类创建单元测试时,我是否必须为此类中的每个方法创建一个单独的.cs
文件?
因为我很难命名我的单元测试方法。我喜欢WhenXXX_ThenYYY
命名约定。但如果我有一个涵盖.cs
所有方法测试的Stats
文件,那你怎么知道它测试的方法是什么?
我的意思是,假设我想测试getTopPlayers
。然后我会创建一个测试方法,如:
WhenLeageNameIsTest_Expect20
但是你怎么能通过查看那个名字告诉测试什么方法..?可以是getHighestScoreInLeague
或getTopPlayers
。
那么我应该在单独的.cs
文件中为方法分隔每个测试吗?或者我应该更改我的命名约定或其他任何内容?
这只是发生在我身上。可以在一个测试方法中执行多个Asserts
吗?
答案 0 :(得分:4)
但是,如何通过查看该名称来判断测试的方法是什么? ......我应该更改我的命名惯例吗?
一种流行的惯例是以
形式命名您的测试方法 MethodUnderTest_Scenario_Expectation()
对你来说,如果使用那个表格,那就是
public void getHighestScoreInLeague_LeagueNameIsTest_Returns20()
这也是Roy Osherove在The Art of Unit Testing中推荐的表格。它使您可以一目了然地了解正在测试的内容和预期内容。你大部分时间都带着你的名字,为那个缺失的清晰度添加方法名称。
通常建议每个测试类有一个测试文件。如果您正在测试许多方法,并且您有许多测试来涵盖这些方法的行为,那么可能是评估您的设计的机会。你的班级做得太多了吗?这并不是说答案立刻就是“是”,这只是一个可能需要考虑一下的想法。当你的课程专注于单一职责时,你的测试(和测试文件)自然也会变小。
这只是发生在我身上。在一种测试方法中可以做多个断言吗?
理想情况下,没有。您希望测试失败只有一个原因。当您有多个断言时,您有多种失败原因。如果它是早期断言失败,则后续断言不会运行。尽可能隔离您的断言。
你的单元测试应该从山顶尖叫特定场景和期望(通过名称)和出错(通过单个断言)。您不一定要启动调试器以找出单元测试失败的位置,尽管并不总是可以避免。
答案 1 :(得分:1)
这里描述了一个很好的结构:http://haacked.com/archive/2012/01/01/structuring-unit-tests.aspx
基本上,SUT中的每个方法都有自己的嵌套类,然后该方法的每个测试都是一个测试方法。当组合时,它们几乎读作句子,例如TheTitleizerMethod.ReturnsDefaultTitleForNullName()
。来自链接的代码示例:
public class TitleizerFacts
{
public class TheTitleizerMethod
{
[Fact]
public void ReturnsDefaultTitleForNullName()
{
// Test code
}
[Fact]
public void AppendsTitleToName()
{
// Test code
}
}
public class TheKnightifyMethod
{
[Fact]
public void ReturnsDefaultTitleForNullName()
{
// Test code
}
[Fact]
public void AppendsSirToMaleNames()
{
// Test code
}
[Fact]
public void AppendsDameToFemaleNames()
{
// Test code
}
}
}