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

本文关键字:单元测试 Net Studio Visual 什么 | 更新日期: 2023-09-27 18:37:13

好的,所以我在 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);
    }
}

三个问题:

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

谢谢

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

1. 什么是单元测试?

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

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

单元测试意味着我们开始测试代码中尽可能小的部分。为了确保我们可以轻松做到这一点,我们将流程自动化。这意味着我们编写测试代码来测试我们的生产代码。

例如:

int a = 3;
int b = 5;
Calculator c = new Calculator();
int sum = c.Sum(a, b);
Assert.AreEqual(8, sum);

此测试可确保计算器类上的 Sum 函数正常工作。

现在,假设您要优化计算器类的内部工作原理。您开始更改和优化代码。每次更改后,您运行单元测试,当它们都成功时,您就知道您没有破坏任何代码。

假设在生产环境中,用户为您的计算器提交错误报告。第一步是编写一个显示此错误的单元测试。在新测试失败后(因为错误仍然存在!),您修复了错误,单元测试成功,您可以确定此错误永远不会再出现。

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

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);
    }
}

您已将控制台的直接依赖替换为接口。当对这段代码进行单元测试时,你可以为你的IOutputService提供一个假货并检查结果。

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

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

您提出的类不是那么可测试,因为它直接在控制台上运行。如果将方法更改为 WriteToConsole(TextWriter out) ;,则会有所不同。在这种情况下,您可以模拟 TextWriter 并做出一些断言,即类输出以完全符合您的期望。这个想法是,如果你编写可测试的代码,你就会写出更好的代码,因为为可测试性而努力会使你的代码更可重用。即使在你的情况下进行单元测试看起来有点愚蠢,但有一个测试证明简单的行为有效,让你更安全,以防你或其他人进一步修改,这可能会改变你定义的期望作为副作用。请注意,我建议你使用一个简单的 TextWriter 作为附加参数来使你的类可测试:我认为你必须做最简单的努力来让你的类可测试,而且由于 TextWriter 是可模拟的,你可以在不重写整个代码的情况下实现测试的好处,这通常是好的。