C#,单元测试入门

https://www.cnblogs.com/KevinMO/articles/5657747.html
https://blog.csdn.net/u013244192/article/details/70821366
https://www.jianshu.com/p/7984955720e2
http://www.javashuo.com/article/p-pgbbwlpp-cr.html
https://www.cnblogs.com/qixuejia/p/5979827.html
https://docs.microsoft.com/en-us/visualstudio/test/unit-test-basics?view=vs-2015html

C#,单元测试入门(如下内容可能来自网络)程序员

1、什么叫单元测试(unit testing)?数据库

是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,通常来讲,要根据实际状况去断定其具体含义,如C语言中单元指一个函 数,Java里单元指一个类,图形化的软件中能够指一个窗口或一个菜单等。总的来讲,单元就是人为规定的最小的被测功能模块。单元测试是在软件开发过程当中 要进行的最低级别的测试活动,软件的独立单元将在与程序的其余部分相隔离的状况下进行测试。编程

C#中,一个方法,一个类,一个窗口的测试。即单元测试。markdown

2、为何要进行单元测试。网络

为了程序的正确性,尽早的发现程序的BUG,便于后期的开发及调试,维护。框架

3、谁作这一工做?ide

答案是:程序员本身,由于程序员才明白本身写的code,才知道要达到的效果。函数

4、何时作?单元测试

单元测试越早越好,早到什么程度?极限编程(Extreme Programming,或简称XP)讲究TDD,即测试驱动开发,先编写测试代码,再进行开发。在实际的工做中,能够没必要过度强调先什么后什么,重要的是高效和感受温馨。从经验来看,先编写产品函数的框架,而后编写测试函数,针对产品函数的功能编写测试用例,而后编写产品函数的代码,每写一个功能点都运行测试,随时补充测试用例。所谓先编写产品函数的框架,是指先编写函数空的实现,有返回值的直接返回一个合适值,编译经过后再编写测试代码,这时,函数名、参数表、返回类型都应该肯定下来了,所编写的测试代码之后需修改的可能性比较小。

5、C#项目测试DEMO, 本demo用VS2015写。

一、 新建一个控制台应用。名称叫:UnitTestDemo

C#,单元测试入门

二、 写一个待测试的方法。

复制代码
public class Program
{
static void Main(string[] args)
{
}

public static int Add(int pNum1,int pNum2)
    {
        return pNum1 + pNum2;
    }
}

复制代码

三、 新建一个单元测试项目。名称叫:UnitTestDemoTest

C#,单元测试入门

修改类名,及方法名。UnitTest1重命名为ProgramTest,方法名:TestMethod1改成:AddTest。

这里说明一下,方法面上面的特性:[TestMethod]这是必须的。告诉编译器这是一个测试法式。

写代码。调用要测试的方法。

复制代码
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using UnitTestDemo;

namespace UnitTestDemoTest
{
[TestClass]
public class ProgramTest
{
[TestMethod]
public void AddTest()
{
int a = 100;
int b = 10;
Assert.AreEqual(Program.Add(a, b), 110);
}
[TestMethod]
}
}
复制代码

四、 打开“测试资源管理器”,在“测试”->窗口->测试资源管理器

C#,单元测试入门

能够看到目前尚未测试项目。

C#,单元测试入门

如今去生成测试项目。

再回来看。是否是多了一个测试

C#,单元测试入门

,在上面右击。选“运行选定测试”,

C#,单元测试入门

能够看到前面多了一个经过标记。表示测试经过。
C#,单元测试入门

若是未经过。是个红色的X,咱们如今再写一个未经过的方法。

注意方法的特性必定要加[TestMethod],而后生成应用,再去运行测试。

复制代码
public void AddTest2()
{
int a = 100;
int b = 10;
Assert.AreEqual(Program.Add(a, b), 50);

}

复制代码

C#,单元测试入门

五、 回到主项目。看方法提示行。上面有标测测试经过。

C#,单元测试入门

在方法上面有一个清楚的提示。

这里说一下VS的强大功能。这个提示很好用。

A、 能够提示方法的引用数量,并快速定位,

B、 还能够提示单元测试的结果。

C、 还能够提示源代码版本管理器,提交及修改的状况。

C#,单元测试入门

六、 以上是手工创建测试项目的。还有一种快捷的方法创建测试项目。在要测试的方法行,右击。选择建立单元测试。可弹出创建单元测试对话框。

C#,单元测试入门

6、如今说说单元测试里Assert这个类。

(一)、Assert类的使用

一、Assert类所在的命名空间为Microsoft.VisualStudio.TestTools.UnitTesting 在工程文件中只要引用Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll就可使用 了。

二、使用Assert类能够对特定功能进行验证,单元测试方法执行开发代码中的方法代码,但只有包含Assert语句时才能报告代码行为方面的内容。

三、Assert在测试方法中,能够调用任意数量的Assert类方法,如Assert.AreEqual()方法。Assert类有不少方法可供选择,其中许多方法具备多个重载。

四、使用CollectionAssert类可比较对象集合,也能够验证一个或多个集合的状态。

五、使用StringAssert类能够对字符串进行比较。此类包含各类有用的方法。如:StringAssert.Contains、StringAssert.Matches和StringAssert.StartWith。

六、AssertFailedException只要测试失败,就会引起AssertFailedException异常。若是测试超时,引起意外的异常,或包含生成了Failed结果的Assert语句,则测试失败。

七、AssertInconclusiveException只要测试生成的结果是Inconclusive,就会引起 AssertInconclusiveException。一般,向仍在处理的测试添加Assert.Inconclusive来指明该测试还没有准备好, 不能运行。

(二)、Assert类主要的静态成员

一、 AreEqual:方法被重载了N屡次,主要功能是判断两个值是否相等;若是两个值不相等,则测试失败。
二、 AreNotEqual:方法被重载了N屡次,主要功能是判断两个值是否不相等;若是两个值相等,则测试失败。
三、 AreNotSame:引用的对象是否不相同;若是两个输入内容引用相同的对象,则测试失败.
四、 AreSame:引用的对象是否相同;若是两个输入内容引用不相同的对象,则测试失败
五、 Fail:断言失败。

六、 Inconclusive:表示没法证实为 true 或 false 的测试结果
七、 IsFalse:指定的条件是否为 false;若是该条件为 true,则测试失败。
八、 IsTrue:指定的条件是否为 true;若是该条件为 false,则测试失败
九、 IsInstanceofType:测试指定的对象是否为所需类型的实例;若是所需的实例不在该对象的继承层次结构中,则测试失

十、 IsNotInstanceofType: 测试指定的对象是否为所需类型的实例;若是所需的实例在该对象的继承层次结构中,则测试失败
十一、 IsNull:测试指定的对象是否为非空
十二、 IsNotNull:测试指定的对象是否为非空

  1. 单元测试中不得不说的知识点
    (1)断言Assertion
    要验证代码的行为是否与指望一致时,咱们须要使用断言来判断某个语句为真或为假,以及某些结果值与指望值是否相等,如IsTrue()、IsFalse()、AreEqual()等。

Assert.AreEqual(expected, actual [, string message]);
其中前两个参数很好理解,分别为指望值和实际值,最后一个可选参数是发生错误时报告的消息。若是不提供的话,出错后会看到这样的error message:Assert.AreEqual failed. Expected: xx. Actual: yy.。若是你的那个单元测试函数中有不少Assert.AreEqual的话,你就不清楚到底是在哪一个Assertion出错的,而当你对每一个Assertion放上相应的message的话,出错时就能够一眼看出具体出错的Assertion。
另外,在用断言进行浮点数的比较时还须要提供另一个参数tolerance。
有时候每一个test里咱们都须要进行一系列相同或者相似的断言,那么咱们能够尝试编写自定义的断言,这样测试的时候使用这个自定义的断言便可。

(2)test 组成
从上面的例子能够看到,test project与普通project的区别就是在class和method上面增长了一个属性。在不一样的框架下这些属性仍是不同的,好比说咱们上面用到的VS里自带的test框架,使用的是[TestClass]和[TestMethod],而你们最经常使用的NUint框架则使用的是[TestFixture]和[Test]。
另外,还有几个attribute在实际项目中咱们也会常常用到,那就是[SetUp]、[TearDown]、[TestFixtureSetUp]和[TestFixtureTearDown]。它们用来在调用test以前设置测试环境和在test以后释放资源。前两个是per-method,即每一个用[Test]修饰的方法在运行先后都会调用[SetUp]和[TearDown];然后两个则是per-class的,即用于[TestFixture]修饰的类的先后。

(3)对于异常的测试
对于预期的异常,只要在测试方法上添加[ExpectedException(typeof(YourExpectedExcetion))]属性便可。可是须要注意的是,一旦这个方法指望的异常抛出了,测试方法中剩余的代码就会被跳过。
因此NUint里面还有一种方式来验证异常,即Assert.Throws<ExpectedException>(() => methodToTest());,这样就能够在一个test method里面验证多个抛出异常的状况了。

(4)使用mock对象
单元测试的目标是一次只验证一个方法或一个类,可是若是这个方法依赖一些其余难以操控的东西,好比网络、数据库等。这时咱们就要使用mock对象,使得在运行unit test的时候使用的那些难以操控的东西其实是咱们mock的对象,而咱们mock的对象则能够按照咱们的意愿返回一些值用于测试。

好比说,咱们在某个函数中须要利用HttpClient经过SendAsync方法从某个EndPoint获取数据进行处理。可是在local测试的时候不必定可以连上那个EndPoint,或者不能保证那个EndPoint会返回什么东西。因此咱们能够写mock一个ResponseHandler,这样咱们就能够把mock的返回结果放进httpClient中传给须要测试的模块,这样就能够测试该模块内后续部分的处理了。

实际上,.NET中如今不少mock对象的框架供选择(参见http://www.mockobjects.org ),不少经常使用的mock均可以直接使用框架,而不须要本身去写。

相关文章
相关标签/搜索