VS2010中的自动化测试(1)——VS2010中的测试管理工具

时间:2022-11-14 14:55:56


概述

在VS2010中为我们的软件测试提供了很多功能及管理工具。这其中包括有:Test View、Test List Editor、Test Results、Code coverage Results、Test Runs以及在VS2010中新增的功能Test Impact View。

在VS2010中我们可以为我们的函数自动生成单元测试,无论它是否是public或者的private的。所有用于单元测试的类和函数都被定义在​​Microsoft.VisualStudio.TestTools.UnitTesting​​这个命名空间中。


创建Unit Test

然后我们在需要单元测试的函数上鼠标右键,如图会有个Create Unit Tests选项。

点击该选项后,就会弹出如下窗口,该窗口会显示出该工程和类中所有的函数,这里我们可以选择我们要进行单元测试的函数。

Assert语句

Assert语句用来比较从方法返回来的值和期望值,然后返回pass或者fail的结果。如果在一个测试方法中有多个Assert的话,那么这个测试方法要通过测试必须让所有的Assert方法通过,不然,其中有一个fail,那么这个Case就会fail。如果我们的单元测试中没有任何的Assert语句,那么它的结果始终是pass的。

数据驱动的单元测试


有时,我们会对同一条测试用例根据不同的输入数据运行多次测试。为了不重复写单元测试代码,VS允许我们的每一条单元测试函数都可以连接自己的数据源,数据源的文件格式可以是CSV、XML、SQL Server数据库或者Oracle数据库等。


例子:


public double CalculateTotalPrice(double quantity)
{
double totalPrice;
double unitPrice;

unitPrice = 16.0;

totalPrice = unitPrice * quantity;
return totalPrice;
}




然后按照平常那样创建一个单元测试之后,修改测试代码如下:






[TestMethod()]
public void CalculateTotalPriceTest()
{
Class1 target = new Class1();
double quantity = 10F;
double expected = 160F;
double actual;
actual = target.CalculateTotalPrice(quantity);
Assert.AreEqual(expected, actual);
}




创建测试用例的数据源,我直接就用一个CSV文件就行了。打开Excel,输入数据如下,然后保存为.csv文件。


VS2010中的自动化测试(1)——VS2010中的测试管理工具

创建好数据源之后,我们重新转到测试工程,然后打开Test View或者Test List Editor窗口,选中我们要连接数据源的测试用例,右键属性,然后点击Data Connection String属性,它会弹出一个连接向导,选择CSV文件,然后选择刚刚保存的csv文件。选择完成之后,该测试用例的属性如下图所示:

VS2010中的自动化测试(1)——VS2010中的测试管理工具

然后会注意到我们之前的测试函数上多加了几个Attribute。现在我们重新修改一下单元测试代码:




[DataSource("Microsoft.VisualStudio.TestTools.DataSource.CSV", 
"|DataDirectory|\\test.csv", "test#csv",
DataAccessMethod.Sequential),
DeploymentItem("TestProject1\\test.csv"),
TestMethod()]
public void CalculateTotalPriceTest()
{
Class1 target = new Class1();
double quantity = Convert.ToDouble
(this.testContextInstance.DataRow["Quantity"]);
double expected = Convert.ToDouble
(this.testContextInstance.DataRow["ExpectedPrice"]);
double actual;
actual = target.CalculateTotalPrice(quantity);
Assert.AreEqual(expected, actual);
}