启动Visual Studio MSTest项目的好方法吗?

时间:2018-10-02 13:14:00

标签: c# unit-testing visual-studio-2017 mstest

我正在VS 2017上为旧软件的新模块启动测试项目。我是TDD和单元测试的新手,所以我想知道这是否是正确的方法...

我首先测试如何将对象添加到viewmodel类的列表中:

[TestClass]
public class RTCM_Config_Test
{
    static RTCM_Bouton input = new RTCM_Bouton();
    static RTCM_Sortie output = new RTCM_Sortie();

    [TestMethod]
    public void CreateConfig()
    {
        //Arrange
        //Act
        RTCM_Config conf = new RTCM_Config();
        //Assert
        Assert.IsNotNull(conf);
    }

    [TestMethod]
    public void AddNewInputInConfig()
    {
        //Arrange
        RTCM_Config conf = new RTCM_Config();
        //Act
        bool isOk = conf.CreateElements(input);
        //Assert
        Assert.IsTrue(isOk);
    }

    [TestMethod]
    public void AddNewOutputInConfig()
    {
        //Arrange
        RTCM_Config conf = new RTCM_Config();
        //Act
        bool isOk = conf.CreateElements(output);
        //Assert
        Assert.IsTrue(isOk);
    }

}

视图模型中的CreateElements函数:

    public bool CreateElements(RTCM_Bouton btn)
    {
        if (listButtonsInput == null) return false;

        if (btn == null) return false;

        if (listButtonsInput.Count >= 10) return false;

        return true;

    }

    public bool CreateElements(RTCM_Sortie sortie)
    {
        if (listButtonsOutput == null) return false;

        if (sortie == null) return false;

        if (listButtonsOutput.Count >= 10) return false;

        return true;
    }

在测试方法之前,我将静态输入和输出对象声明为测试参数,这是个好方法吗?还是应该在每种测试方法中声明测试对象?

谢谢!

2 个答案:

答案 0 :(得分:2)

我不是100%知道您的要求,但我认为您的要求如何处理传递的参数RTCM_Bouton btn和RTCM_Sortie出手。

public bool CreateElements(RTCM_Bouton btn)
{
    if (listButtonsInput == null) return false;

    if (btn == null) return false;

    if (listButtonsInput.Count >= 10) return false;

    return true;

}

对我来说这段代码有4个可能的返回值或路由,所以我需要4个测试,通常我遵循命名约定MethodName_Scenario_ExpectedResult

CreateElements_ListButtonsIsNull_ReturnsFalse()
CreateElements_BtnIsNull_ReturnsFalse()
CreateElements_ListButtonsIsNull_ReturnsFalse()
CreateElements_ListInputButtonsIs10orMore_ReturnsTrue()

您应该使用测试的// arrange部分来“设置”测试,包括方法需要运行的所有内容。用最小的实现创建类和您需要通过的所有对象(恰好足以使测试通过)。

例如

[TestMethod]
CreateElements_BtnIsNull_ReturnsFalse()
{
//arrange
RTCM_Config conf = new RTCM_Config();
var RTCM_Bouton btn = null;

//act
var result = conf.CreateElements(btn);

//assert
Assert.IsFalse(result);
}

因为对于某些测试,RTC​​M_Bouton需要为空,而对于其他测试,则为值,因此我将在每个测试的ranging方法中声明它,而不是像全局变量那样声明它。

答案 1 :(得分:1)

对于const测试对象RTCM_Config,可以使用类变量,并通过测试初始化​​方法对其进行初始化:

private RTCM_Config _config;

[TestInitialize]
public void TestInitialize()
{
    _config = new RTCM_Config();
}

我认为,欢迎任何减少代码的内容。您还可以为按钮引入一个类变量,但是您必须为每个测试用例重新排列它。

第二个问题,您可以使用数据驱动的测试。

[DataTestMethod]        
[DataRow(60, 13d)]
[DataRow(1800, 44d)]
public void Testcase(int input, double expected)
{
   //Do your stuff
}

编码愉快!