用VS自带的Unit Test测试一个方法时,若需要大量的输入参数,可以按照以下方法把参数放在一个文件(数据库也可)里,可以省去重复代码。
假设要测试的方法为:
static int Sum(int x, int y) { return x + y; }
右键这个方法,自动创建出unit test工程,这个大家都知道的,就不说了
创建的测试代码如下:
/// <summary> ///A test for Sum ///</summary> [TestMethod()] [DeploymentItem("ConsoleApplication1.exe")] public void SumTest() { int x = 0; // TODO: Initialize to an appropriate value int y = 0; // TODO: Initialize to an appropriate value int expected = 0; // TODO: Initialize to an appropriate value int actual; actual = Program_Accessor.Sum(x, y); Assert.AreEqual(expected, actual); Assert.Inconclusive("Verify the correctness of this test method."); }
在菜单中选择Test下的Windows => Test View
图。。。
在出现的Test View列表中选择要测试的方法,右键选择属性
图。。。
点Data Connection String右边的小button,
图。。。
我们可以选择其中任一种,这里我们选择xml,这个xml中描述了我们需要用到的数据
图。。。
如果xml格式正确,可以预览出
我的xml如下:
<InputParameter> <Parameter> <x>0</x> <y>0</y> <expect>0</expect> </Parameter> <Parameter> <x>65536</x> <y>1</y> <expect>65537</expect> </Parameter> <Parameter> <x>-65536</x> <y>-1</y> <expect>-65537</expect> </Parameter> </InputParameter>
一路OK下去,最后发现我们的测试方法上面增加了一段话:
- [DataSource("Microsoft.VisualStudio.TestTools.DataSource.XML", "|DataDirectory|\\SumParameters.xml", "", DataAccessMethod.Sequential), DeploymentItem("××××.UnitTest\\SumParameters.xml"), DeploymentItem("ConsoleApplication1.exe"), TestMethod()]
DeploymentItem中指定了xml文件的路径,如果改变了xml的路径,也要在这里做相当的更改。
下面我们改一下测试方法的代码:
/// <summary> ///A test for Sum ///</summary> [DataSource("Microsoft.VisualStudio.TestTools.DataSource.XML", "|DataDirectory|\\SumParameters.xml", "", DataAccessMethod.Sequential), DeploymentItem("Microsoft.SeoTools.UnitTest\\SumParameters.xml"), DeploymentItem("ConsoleApplication1.exe"), TestMethod()] public void SumTest() { int x = int.Parse(TestContext.DataRow["x"].ToString()); int y = int.Parse(TestContext.DataRow["y"].ToString()); int expected = int.Parse(TestContext.DataRow["expect"].ToString()); int actual = Program_Accessor.Sum(x, y); Assert.AreEqual(expected, actual); }
我们可以用TestContext.DataRow去访问测试数据中的字段。
在xml中我们的测试数据有三条,在run这个测试方法时,unit test会依次获取这三条记录并运行。我们的代码中只用写一次,挺帅的,哈哈
关于unit test的一些介绍,可以参见
http://msdn.microsoft.com/en-us/library/ms379625(VS.80).aspx