所谓的单元测试(Unit Test),就是对软件的一些模块进行测试以检查其正确性和可靠性,这些模块可以是一个类或者是一个方法等。在Visual studio中,这十分容易实现。
打开Visual studio,文件->新建->项目,在此演示的是为通用Windows平台创建单元测试,因此展开Visual C#->Windows->通用->单元测试应用(通用Windows)。如图,
这里单元测试的项目名为UnitTest4Demo
创建完成后,为了使条理清晰,我们在解决方案中新建一个类库(ClassLibrary),将要测试的方法放在类库中,而UnitTest4Demo调用放在类库中的待测试方法。
右击解决方案->添加->新建项目->类库(通用Windows),如图
类库取名为ClassLibrary4Test
创建完成后,解决方案管理器里应类似下图
刚刚已经说了,类库里面放待测试方法,UnitTest4Demo负责调用并测试类库中的方法,因此UnitTest4Demo应引用ClassLibrary4Test。右击UnitTest4Demo下的引用->添加引用->勾选ClassLibrary4Test,如图
确定后,UnitTest4Demo下的引用应类似下图,注意:红线的部分就是刚刚添加的对类库的引用
现在,在类库ClassLirary4Test中的Class1.cs中写个方法,简单起见,就让这个方法返回个0
1 public class Class1 2 { 3 public static int ReturnZero() 4 { 5 return 0; 6 } 7 }
接着,在UnitTest4Demo中UnitTest.cs中的TestMethod1方法中调用此函数,如图
在这个UnitTest1类中,第一点,我们注意到UnitTest1被添加了TestClass属性类,方法TestMethod1被添加了TestMethod属性类,这就是用来单元测试的类和函数与一般的类和函数不同之处,这就告诉了Visual Studio我这个函数是用来测试的,Visual Studio就会将这个带有TestClass属性的类下的,带有TestMethod属性的方法放到测试资源管理器中(测试资源管理器展开方法:菜单栏->测试->窗口->测试资源管理器)
第二点就是这个函数里面就写了一句话,Assert是用于单元测试“断言”的类,即我输入一些参数(当然此示例没有输入参数),如果方法运行正确我“断言”应得到的结果,如果不符,Visula studio在测试后会给出相关的信息,这就达到了测试的效果。当然这个类有很多的重载,参见MSDN:Assert类
我们会注意到,此时测试资源管理器空空如也,并没有TestMehod1方法,这是我们没有生成解决方法的原因,现在生成解决方案:菜单栏->生成->生成解决方案
生成之后,测试资源管理器中会出现TestMehod1方法,如图
下面执行测试,右击测试单元管理器中的TestMethod1->运行选定的测试
稍等片刻,将会出现通过测试。
至此,一个简单的单元测试完成了。
你可以在单元测试中测试更多,更复杂的方法,下面就展示一个稍微复杂一些的用于测试通用应用的网络通信的示例。
在ClassLibrary4Test类库中新建一个HttpHelper类,类中写个用于Get请求的方法。
1 public class HttpHelper 2 { 3 /// <summary> 4 /// Send Get request and retrieve the response as a string 5 /// </summary> 6 /// <param name="url">url</param> 7 /// <returns>response</returns> 8 public static async Task<string> SendGetRequest(string url) 9 { 10 HttpClient httpClient = new HttpClient(); 11 Uri uri = new Uri(url); 12 HttpResponseMessage response = new HttpResponseMessage(); 13 string httpResonseBody = string.Empty; 14 try 15 { 16 response = await httpClient.GetAsync(uri); 17 response.EnsureSuccessStatusCode(); 18 httpResonseBody = await response.Content.ReadAsStringAsync(); 19 } 20 catch 21 { } 22 return httpResonseBody; 23 } 24 }
在UnitTest4Demo的UnitTest.cs中新写个方法TestMothod_Http,调用刚写的SendGetRequest方法。
1 [TestMethod] 2 public async Task TestMethod_Http() 3 { 4 string url = "http://mywebapidemo.azurewebsites.net/api/Default"; 5 string response = await HttpHelper.SendGetRequest(url); 6 Assert.AreEqual("Hello,World!", response.Replace("\"", "")); 7 8 }
生成解决方案,和刚刚一样,测试资源管理器中在生成后悔出现TestMethod_Http,测试之,可以顺利通过测试。