VS2010的单元测试,很好用

TDD(测试驱动开发)一直都是敏捷里一个重要的方法,毕竟经过测试用例检验过的代码总会让人更加放心,关于软件测试我们有白盒测试,黑盒测试,灰盒测试等许多手段,其中单元测试更是必不可少而且非常有效。VS.net环境的单元测试是做得比较智能化而且好用的,我们就来试试吧。

首先,打开VS2010,创建一个简单的C#控制台程序,输入如下代码:(简单的加法减法)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static int add(int a, int b)
        {
            return a + b;
        }

        public int sub(int a, int b)
        {
            return a - b;
        }

        static void Main(string[] args)
        {
            Console.WriteLine(add(3, 4));
        }
    }
}
然后在函数“add”的名称上邮件鼠标,选择创建单元测试用例如下图


VS2010自动为我们创建一个新的测试项目,打开其中的源文件ProgramTest.cs,设置自己的测试集(为了展示方便,sub函数我也增加单元测试)

        /// <summary>
        ///add 的测试
        ///</summary>
        [TestMethod()]
        [DeploymentItem("ConsoleApplication1.exe")]
        public void addTest()
        {
            int a = 5; // TODO: 初始化为适当的值
            int b = 3; // TODO: 初始化为适当的值
            int expected = 11; // TODO: 初始化为适当的值
            int actual;
            actual = Program_Accessor.add(a, b);
            Assert.AreEqual(expected, actual);
            //Assert.Inconclusive("验证此测试方法的正确性。");
        }

        /// <summary>
        ///sub 的测试
        ///</summary>
        [TestMethod()]
        [DeploymentItem("ConsoleApplication1.exe")]
        public void subTest()
        {
            Program_Accessor target = new Program_Accessor(); // TODO: 初始化为适当的值
            int a = 5; // TODO: 初始化为适当的值
            int b = 2; // TODO: 初始化为适当的值
            int expected = 3; // TODO: 初始化为适当的值
            int actual;
            actual = target.sub(a, b);
            Assert.AreEqual(expected, actual);
            //Assert.Inconclusive("验证此测试方法的正确性。");
        }
    }
运行测试项目,可以看到下面的测试结果,然后再针对结果去查询出错时因为程序的bug还是测试集选取的问题。


我再增加一个类实现求幂的功能

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{

    class Test
    {
        private int a;
        private int b;

        Test()
        {
            a = 3;
            b = 4;
        }

        public int pow()
        {
            return int.Parse(Math.Pow(a, b).ToString());
        }
    }
    class Program
    {
        static int add(int a, int b)
        {
            return a + b;
        }

        public int sub(int a, int b)
        {
            return a - b;
        }

        static void Main(string[] args)
        {
            Console.WriteLine(add(3, 4));
        }
    }
}
同样的方法针对Test添加单元测试,如下(3的4次方是81):

        /// <summary>
        ///pow 的测试
        ///</summary>
        [TestMethod()]
        public void powTest()
        {
            Test_Accessor target = new Test_Accessor(); // TODO: 初始化为适当的值
            int expected = 81; // TODO: 初始化为适当的值
            int actual;
            actual = target.pow();
            Assert.AreEqual(expected, actual);
            //Assert.Inconclusive("验证此测试方法的正确性。");
        }
然后运行测试项目,可以看到如下结果:


我觉得编写测试代码是一个好习惯,不过如何设计测试用例,如何能够让测试用例覆盖程序的所有分支确实是比较麻烦的事情,不过多做单元测试还是能对提升我们编码质量,增强我们的编程信心,呵呵



  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 是的,通常情况下,在单元测试中使用`Scanner`可以会产生一些问题。主要原因是单元测试是自动化测试,其输入是通过程序传递的,而不是从控制台输入。因此,使用`Scanner`在单元测试中很难模拟控制台输入。另外,`Scanner`也不是线程安全的,这也可能导致一些问题。 一种解决方案是使用模拟输入,例如使用`System.setIn()`方法将输入流重定向到一个字符串流。这样,就可以将字符串作为输入传递给被测试的方法,而无需使用`Scanner`。另外,你也可以考虑使用Mockito或其他测试框架来模拟输入。 总之,在单元测试中,最好避免使用`Scanner`,而是使用其他适当的方法来模拟输入。 ### 回答2: 在单元测试中不能使用Scanner的主要原因有以下几个方面。 首先,单元测试旨在验证代码的逻辑正确性,而不是与外部资源的交互。Scanner是一种用于从标准输入、文件和其他资源中读取数据的工具类,它与外部资源的交互会导致单元测试的不可控性。单元测试应该是独立、可重复的,如果代码中使用了Scanner,那么测试将受到外部输入的干扰,无法保证测试的一致性和可靠性。 其次,Scanner的使用涉及到与外部资源的交互,例如从控制台读取用户输入。在自动化测试过程中,无法依赖于人工输入,而应该使用自动化工具来模拟输入。而Scanner无法与自动化测试工具集成,无法模拟外部输入。为了确保测试的可控性和可自动化性,应该避免在单元测试中使用Scanner。 最后,Scanner的使用会引入额外的复杂性和依赖性。代码的可测试性是一个重要的软件设计原则,应该在编写代码的过程中考虑到测试的需求。引入Scanner会使代码和测试之间产生紧密的耦合,使得测试变得困难和脆弱。为了保持代码的简洁性和可维护性,应该避免在单元测试中使用Scanner。 综上所述,为了确保单元测试的可靠性和可自动化性,并保持代码的简洁性和可维护性,我们应该避免在单元测试中使用Scanner,而是通过其他方式模拟输入,如使用Mock对象、模拟框架或测试替身来代替Scanner的功能。 ### 回答3: 在单元测试中,Scanner无法使用的主要原因是它需要与用户的交互来获取输入。而在自动化的单元测试环境中,无法进行人工交互,因此无法使用Scanner进行输入操作。 此外,单元测试的目的是测试每个具体的单元(函数或方法)是否按照预期正确运行。Scanner通常用于获取用户输入,而用户的输入是无法预测的,因此无法在单元测试中提供准确的输入。 为了在单元测试中模拟用户输入,我们需要使用特殊的测试框架或者工具,例如JUnit或Mockito。这些工具可以模拟用户的输入,以便测试被测单元的各种情况和边界条件。 总之,虽然Scanner是一个方便的输入工具,但在单元测试中无法使用。单元测试应该是自动化的,无法进行人工交互。因此,我们需要使用其他方法或工具来模拟用户输入和测试各种输入情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值