1

我有一堂课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可以在一种测试方法中进行多项操作吗?

4

2 回答 2

4

但是,如何通过查看该名称来判断测试的方法是什么?...我应该改变我的命名约定吗?

一种流行的约定是在表格中命名您的测试方法

 MethodUnderTest_Scenario_Expectation()

对你来说,如果使用那种形式,那就是

 public void getHighestScoreInLeague_LeagueNameIsTest_Returns20()

这也是 Roy Osherove 在The Art of Unit Testing中推荐的一种形式。它使您一目了然地了解正在测试的内容和预期的内容。您大部分时间都在使用您的名字,添加方法名称以清楚地说明缺失的部分。

通常建议每个被测类有一个测试文件。如果您有很多方法正在测试,并且您有很多很多测试来涵盖这些方法的行为,那么也许这是一个评估您的设计的机会。你的班级做得太多了吗?这并不是说答案立即是“是的”,这只是一个可能需要考虑片刻的想法。当您将课程保持在较小的范围内并专注于单一职责时,您的测试(和测试文件)自然也会变小。


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

理想情况下,没有。您希望测试失败仅出于一个原因。当您有多个断言时,您有多种失败的原因。如果是早期断言失败,则后续断言不会运行。尽可能隔离您的断言。

您的单元测试应该从山顶尖叫特定场景和期望(通过名称)以及出了什么问题(通过单个 Assert)。你不一定要启动调试器来找出单元测试失败的地方,尽管它并不总是可以避免的。

于 2013-03-15T13:47:03.620 回答
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
        }
    }
}
于 2013-03-15T15:50:13.043 回答