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

什么是单元测试?如何在Visual Studio中使用C#.Net进行单元测试,c#,visual-studio-2010,unit-testing,C#,Visual Studio 2010,Unit Testing,好的,我有以下C语言的课程: 三个问题: 什么是单元测试 在上面的例子中,单元测试是否有益 我将如何对上述示例进行“单元测试” 谢谢您建议的类不太可测试,因为它直接在控制台上工作。如果您更改WriteConsole(TextWriter out)的方法,则情况会有所不同;。在这种情况下,您可以模拟TextWriter,并断言类输出到控制台的内容与您期望的完全相同。其思想是,如果您编写可测试代码,您就可以编写更好的代码,因为为可测试性而工作会使您的代码更加可重用。即使在您的情况下,进行单元测试似乎

好的,我有以下C语言的课程:

三个问题:

  • 什么是单元测试
  • 在上面的例子中,单元测试是否有益
  • 我将如何对上述示例进行“单元测试”

  • 谢谢

    您建议的类不太可测试,因为它直接在控制台上工作。如果您更改WriteConsole(TextWriter out)的方法,则情况会有所不同;。在这种情况下,您可以模拟TextWriter,并断言类输出到控制台的内容与您期望的完全相同。其思想是,如果您编写可测试代码,您就可以编写更好的代码,因为为可测试性而工作会使您的代码更加可重用。即使在您的情况下,进行单元测试似乎有点愚蠢,但如果您或其他人进行了进一步的修改,那么让测试证明简单的行为有效会使您更加安全,这可能会作为您定义的期望的副作用而发生变化。请注意,我建议您使用一个简单的TextWriter作为额外的参数,以使您的类可测试:我认为您必须尽最简单的努力使您的类可测试,而且由于TextWriter是可模仿的,您可以在不重写整个代码的情况下实现测试的好处,这通常是好的。

    1。什么是单元测试

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

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

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

    例如:

    int a = 3;
    int b = 5;
    
    Calculator c = new Calculator();
    int sum = c.Sum(a, b);
    
    Assert.AreEqual(8, sum);
    
    此测试确保计算器类上的求和函数正常工作

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

    假设在生产环境中,用户为您的计算器提交错误报告。您的第一步将是编写一个显示此bug的单元测试。在新测试失败之后(因为bug仍然存在!)您修复了bug,单元测试成功了,您可以确定这个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);
    
        }
    }
    
    您已经用接口替换了对控制台的直接依赖。当单元测试这段代码时,您可以为IOutputService提供一个假代码并检查结果

    一本真正的好书是。它显示了编写单元测试和模式时常见的陷阱,以避免/修复它们


    几个月前,我也谈到了可测试代码。它有点先进,但也许你能从中得到一些东西。如果您有任何问题,请随时提问。

    您做过任何研究吗?我投票结果相近的原因:这个问题过于宽泛,缺乏“您尝试了什么”的证据。是的,我找到了很多一般信息,但我正在.Net和Visual Studiot的背景下寻找答案谢谢!这个答案很有道理,值得所有的反对票=)
    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);
    
        }
    }