什么是单元测试,如何在Visual Studio中使用C#.Net进行单元测试

JMK*_*JMK -2 c# unit-testing visual-studio-2010

好的,所以我在C#中有以下类:

class Program
{
    static void Main(string[] args)
    {
        MyClass myClass = new MyClass("Hello World");
        myClass.WriteToConsole();
    }
}

class MyClass
{
    private string MyProperty { get; set; }

    public MyClass(string textToEncapsulate)
    {
        MyProperty = textToEncapsulate;
    }

    public void WriteToConsole()
    {
        Console.WriteLine(MyProperty);
    }
}
Run Code Online (Sandbox Code Playgroud)

三个问题:

  1. 什么是单元测试?
  2. 在上面的例子中,单元测试是否有益?
  3. 我将如何进行上述示例的"单元测试"?

谢谢

Wou*_*ort 5

1.什么是单元测试?

手动测试非常耗时.每次手动运行完全相同的测试集可能很困难,以确保代码的所有部分都按预期运行.在手动测试完整产品时,测试所有代码路径也非常困难.

当数据库不可用时,您将如何测试代码的反应?或者存储了一些错误数据?这需要相当长的时间才能做到正确.

单元测试意味着我们开始测试代码中最小的部分.为了确保我们能够轻松完成这项工作,我们可以自动完成流程.这意味着我们编写测试生产代码的测试代码.

例如:

int a = 3;
int b = 5;

Calculator c = new Calculator();
int sum = c.Sum(a, b);

Assert.AreEqual(8, sum);
Run Code Online (Sandbox Code Playgroud)

此测试确保您的Calculator类上的Sum函数正常工作.

现在,假设您要优化Calculator类的内部工作方式.您开始更改和优化代码.每次更改后,您都会运行单元测试,当它们全部成功后,您就会知道您没有破坏任何代码.

假设在生产中,用户会为您的计算器提交错误报告.您的第一步是编写显示此错误的单元测试.在新测试失败后(因为错误仍在那里!)你修复了错误,单元测试成功,你可以确定这个bug永远不会回来.

这种安全带是单元测试的最大好处之一.

2在上面的例子中,单元测试是否有益?3我将如何进行上述示例的"单元测试"?

单元测试是一种很好的做法.它可以帮助您证明您的代码正常运行.但是,在您的示例中,测试代码将很困难.

控制台的输出不是可以轻松测试的.但是,如果您将抽象出Console.WriteLine的概念,那么您的代码将变得更易于测试.

写单元测试实际上非常简单.问题是编写可以实际测试的代码.

一个更好的可测试版本的代码将是:

class Program
{
    static void Main(string[] args)
    {
        MyClass myClass = new MyClass(new ConsoleOutputService(), "Hello World");
        myClass.WriteToConsole();
    }
}

public interface IOutputService
{

    void WriteLine(string MyProperty);
}

public class ConsoleOutputService : IOutputService
{
    public void WriteLine(string MyProperty)
    {
        Console.WriteLine(MyProperty);
    }
}

class MyClass
{
    private IOutputService _outputService;
    private string MyProperty { get; set; }

    public MyClass(IOutputService outputService, string textToEncapsulate)
    {
        _outputService = outputService;
        MyProperty = textToEncapsulate;
    }

    public void WriteToConsole()
    {
        _outputService.WriteLine(MyProperty);

    }
}
Run Code Online (Sandbox Code Playgroud)

您已使用接口替换了对控制台的直接依赖性.单元测试此代码时,您可以为IOutputService提供虚假信息并检查结果.

一本非常好的书是xUnit Test Patterns.它显示了编写单元测试和模式的常见缺陷,以避免/修复它们.

几个月前,我自己也写了一篇关于可测试代码的博客.它有点先进,但也许你可以从中得到一些东西.如果您有任何问题随时问.