关于Windows 8 开发之测试代码的使用方法 |
本文标签:Windows8,测试代码 1.创建解决方案和单元测试项目 注意:是先创建一个项目,然后再这个项目中添加测试项目,这样符合我们在开发中需要对我们的项目进行测试的需求 。 6).在 Visual Studio 编辑器中打开 UnitTest1.cs 。 复制代码 代码如下:namespace UnitTestLibraryTest { [TestClass] public class UnitTest1 { [TestMethod] public void TestMethod1() {</p> <p> } } } 注意以下事项: a.每个测试都是使用 [TestMethod] 定义的 。测试方法必须返回 void,并且不能具有任何参数 。在类名前一行,加上[TestClass]的声明. b.测试方法必须位于使用 [TestMethod] 特性修饰的类中 。运行测试时,将为每个测试类创建一个实例 。将按未指定顺序调用测试方法 。 c.您可定义在每个模块、每个类或每个方法前后调用的特定方法 。 d.在文件头部加入using Microsoft.VisualStudio.TestPlatform.UnitTestFramework;的引用 。 7).测试前的初始化及测试后的清理 。用法及代码如下: 复制代码 代码如下:namespace UnitTestLibraryTest { [TestClass] public class UnitTest1 { private int a; private int b;</p> <p> // 当前测试类运行第一个测试方法之前执行,类似于构造函数 [ClassInitialize] public static void MyClassInit(TestContext context) { } // 所有测试方法运行完毕后执行,类似于析构函数 [ClassCleanup] public static void MyClassEnd() { }</p> <p> //每个测试方法运行之前执行 [TestInitialize] public void Init() { a = 1; b = 1; } //每个测试方法运行之后执行 [TestCleanup] public void End() { a = 0; b = 0; }</p> <p> } } 注意:以上方法,方法名可以自定义,无返回值,除了[ClassInitialize]的那个函数有个TestContext的参数外,其他无参数 。 2.验证测试是否在测试管理资源器中运行 1).在 UnitTest1.cs 文件的 TestMethod1 中插入一些测试代码: 复制代码 代码如下:[TestMethod] public void AddTestMethod() { int a = 1; int b = 2; int sum = a+b; Assert.AreEqual(3,sum); } 注意,Assert 类提供的若干静态方法可用于验证测试方法的结果 。 2).在“测试”菜单上,选择“运行”,然后选择“全部运行” 。 3.向MyTestProject项目添加Rooter类 1).在“解决方案资源管理器”中,选择“MyTestProject”项目名称 。从快捷菜单中选择“添加”,然后选择“类” 。 复制代码 代码如下:public class Rooter { public Rooter() { } public double SquareRoot(double x) { return 0.0; } } Rooter 类声明一个构造函数和 SqareRoot estimator 方法 。 4).SqareRoot 方法只是一个最小实现,足以为测试设置测试基本结构 。 4.将测试项目合并为应用程序项目 1).将对 "MyTestProject"应用程序的引用添加到 UnitTestLibraryTest项目中 。 2).向 UnitTest1.cs 文件添加 using 语句: a.打开 UnitTest1.cs 。 b.在 using Microsoft.VisualStudio.TestPlatform.UnitTestFramework; 行下添加代码:using MyTestProject; 3).添加使用 Rooter 函数的测试 。将下列代码添加到 UnitTest1.cs: 复制代码 代码如下:[TestMethod] public void BasicTest() { Rooter rooter = new Rooter(); double expected = 0.0; double actual = rooter.SquareRoot(expected * expected); double tolerance = .001; Assert.AreEqual(expected, actual, tolerance); } 4).生成解决方案 。 新测试将显示在测试资源管理器的“未运行的测试”节点中 。 5).在测试资源管理器中,选择“全部运行” 。 已通过基本测试 您已设置测试和代码项目,并验证了您可在代码项目中运行运行函数的测试 。现在您可开始编写真实测试和代码 。 5.以迭代方式增加测试并使这些测试通过 。 1).添加新测试: 复制代码 代码如下:[TestMethod] public void RangeTest() { Rooter rooter = new Rooter(); for (double v = 1e-6; v < 1e6; v = v * 3.2) { double expected = v; double actual = rooter.SquareRoot(v * v); double tolerance = ToleranceHelper(v); Assert.AreEqual(expected, actual, tolerance); } }</p> <p> private double ToleranceHelper(double expected) { return expected / 3.2; } 提示:建议您不要更改已通过的测试 。而是添加新测试,更新代码以便测试通过,然后添加其他测试等 。 当您的用户更改其要求时,请禁用不再正确的测试 。编写新测试并使它们以相同的增量方式一次运行一个 。 2).在测试资源管理器中,选择“全部运行” 。 3).测试将不会通过 。 RangeTest 未通过 提示:编写测试后,立即验证每个测试是否都将失败 。这帮助您避免易犯的错误,不会编写从不失败的测试 。 4).增强受测代码,以便新测试通过 。将 Rooter.cs 中的 SqareRoot 函数更改为: 复制代码 代码如下:public double SquareRoot(double x) { double estimate = x; double diff = x; while (diff > estimate / 1000) { double previousEstimate = estimate; estimate = estimate - (estimate * estimate - x) / (2 * estimate); diff = Math.Abs(previousEstimate - estimate); } return estimate; } 5).生成解决方案,然后在测试资源管理器中,选择“全部运行” 。 现在所有三个测试都将通过 。 提示:通过添加测试的方式一次性开发代码 。确保所有测试在每次迭代后都通过 。 6.调用未通过的测试 1).向 UnitTest1.cs 添加另一个测试: 复制代码 代码如下:[TestMethod] public void NegativeRangeTest() { string message; Rooter rooter = new Rooter(); for (double v = -0.1; v > -3.0; v = v - 0.5) { try { // Should raise an exception: double actual = rooter.SquareRoot(v);</p> <p> message = String.Format("No exception for input {0}", v); Assert.Fail(message); } catch (ArgumentOutOfRangeException ex) { continue; // Correct exception. } catch (Exception e) { message = String.Format("Incorrect exception for {0}", v); Assert.Fail(message); } } } 2).在测试资源管理器中,选择“全部运行” 。 测试将不会通过 。在测试资源管理器中选择测试名称 。将突出显示失败的断言 。失败消息将在测试资源管理器的细节窗格中可见 。NegativeRangeTests 未通过 。 3).若要查看测试未通过的原因,请单步执行以下函数: a.在 SquareRoot 函数的开头设置断点 。 b.在未通过测试的快捷菜单上,选择“调试选定的测试” 。 当运行在断点处停止时,请单步执行以下代码 。 c.向 Rooter 方法添加代码以捕获异常,将SquareRoot方法修改如下(对x进行判断捕获异常): 复制代码 代码如下:public double SquareRoot(double x) { if (x < 0.0) { throw new ArgumentOutOfRangeException(); } double estimate = x; double diff = x; while (diff > estimate / 1000) { double previousEstimate = estimate; estimate = estimate - (estimate * estimate - x) / (2 * estimate); diff = Math.Abs(previousEstimate - estimate); } return estimate; } 在测试资源管理器中,选择“全部运行”以测试已纠正的方法,并确保您未引入回归测试 。所有测试都将通过 。 |