如何构建我的单元测试?

时间:2015-03-20 19:13:57

标签: c# unit-testing

我是单元测试的新手,想知道如何开始测试。我目前正在处理的应用程序没有任何单元测试。它是一个winform应用程序,我只对测试此应用程序的数据层感兴趣。

这是一个例子。

public interface ICalculateSomething
{
     SomeOutout1 CalculateSomething1(SomeInput1 input1);
     SomeOutout2 CalculateOSomething2(SomeInput2 input2);
}

public class CalculateSomething : ICalculateSomething
{
    SomeOutout1 ICalculateSomething.CalculateSomething1(SomeInput1 input1)
    {
        SomeOutout1.Prop1 = calculateFromInput1(input1.Prop1, input1.Prop2);

        SomeOutout1.Prop3 = calculateFromInput2(input1.Prop3, input1.Prop4);

        return SomeOutout1;
    }

    SomeOutout2 ICalculateSomething.CalculateOSomething2(SomeInput2 input2)
    {
        SomeOutout2.Prop1 = calculateFromInput1(input2.Prop1, input2.Prop2);

        SomeOutout2.Prop3 = calculateFromInput2(input2.Prop3, input2.Prop4);

        return SomeOutout2;
    }
}

我想在CalculateSomething中测试这两种方法。这些方法实现漫长而复杂。我应该如何构建我的测试?

3 个答案:

答案 0 :(得分:2)

我没有看到不使用直接单元测试实现的原因。我将从一个基本的测试方法开始:

[TestMethod]
public void CalculateSomething1_FooInput
{
    var input = new SomeInput1("Foo");
    var expected = new SomeOutput1(...);

    var calc = new CalculateSomething(...);
    var actual = calc.CalculateSomething1(input);

    Assert.AreEqual(expected.Prop1, actual.Prop1);
    Assert.AreEqual(expected.Prop2, actual.Prop2);
    Assert.AreEqual(expected.Prop3, actual.Prop3);
}

然后,在添加CalculateSomething1_BarInputCalculateSomething2_FooInput时,将一些常用代码分解为辅助方法:

[TestMethod]
public void CalculateSomething1_FooInput
{
    var input = new SomeInput1("Foo");
    var expected = new SomeOutput1(...);

    var actual = CreateTestCalculateSomething().CalculateSomething1(input);

    AssertSomeOutput1Equality(expected, actual);
}

答案 1 :(得分:1)

就单元测试而言,您必须为所需的功能创建测试方法。

[TestMethod()]
public void CalculateSomething1()
{
    // First we have to define the input for the fucntion
    var input = new SomeInput1(); // Assumes your constructor creates the value for prop1 and prop2.  Change as needed.

    var classToBeTested = new CalculateSomething();
    var output = classToBeTested(input);

    // There are multiple ways to test if the outcome is correct choose the one that is correct for the method/output.
    Assert.IsNotNull(output);
}

上面的方法将在单元测试项目和相关的类文件中。

单元测试时需要注意的一些事项

  • 单元测试需要独立
  • 应将冗长复杂的代码重新分解为较小的代码单元并进行测试。
  • 接口是一种删除依赖项的绝佳方法。接口的使用允许诸如模拟之类的概念。模拟起初可能有点复杂,所以在学习它时要花些时间。有几个模拟框架可以帮助很多。即RhinoMocks,Moq就是一对夫妇。

答案 2 :(得分:1)

这些是显式实现的属性,因此您必须使用接口引用来测试它们。

var input1 = new SomeInput1();
// setup required data in input1.

ICalculateSomething calculator = new CalculateSomething();
var output = calculator.CalculateSomething1(input1);

// Have assert statements on the properties of output to verify the calculation.

不要将calculator用于var,因为这会为您提供CalculateSomething引用,并且隐藏接口方法。