单元测试的文件范围

时间:2013-03-15 13:43:33

标签: c# unit-testing

我有一个班级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

但是你怎么能通过查看那个名字告诉测试什么方法..?可以是getHighestScoreInLeaguegetTopPlayers

那么我应该在单独的.cs文件中为方法分隔每个测试吗?或者我应该更改我的命名约定或其他任何内容?

修改

这只是发生在我身上。可以在一个测试方法中执行多个Asserts吗?

2 个答案:

答案 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
        }
    }
}