标签:
源码下载地址:http://pan.baidu.com/s/1ntooNO1
我们建议你创建单元测试来帮助保持你的代码在众多递进式开发步骤中正确运行。 你可以使用几个框架来编写单元测试,包括第三方开发的一些框架。 某些测试框架专用于不同语言或平台中的测试。 "测试资源管理器"为其中任意框架中的单元测试提供了一个接口。 大多数常用框架都有适配器,你可以为其他框架编写自己的适配器。
"测试资源管理器"将取代 Visual Studio 早期版本中的单元测试窗口。 其优点包括:
使用"测试资源管理器"运行单元测试
例如,创建使用 MSTest 框架的测试:
在"新建项目"对话框中,展开"Visual Basic"、"Visual C#"或"Visual C++",然后选择"测试"。
选择"单元测试项目"。
解决方案生成,测试运行。
"测试资源管理器"将打开并显示结果摘要。
若要查看完整测试列表:请在任意类别中选择"全部显示"。
若要返回到摘要,请选择"HOME"视图。
若要查看测试结果的详细信息:请在"测试资源管理器"中选择该测试以查看详细信息,例如详细信息窗格中的异常消息。
若要导航到测试的代码:请在"测试资源管理器"中双击该测试或从快捷菜单上选择"打开测试"。
若要调试测试:请打开一个或多个测试的快捷菜单,然后选择"调试选定的测试"。
|
显示的结果是最近运行的测试结果。 彩色的结果栏仅显示曾经运行的测试的结果。 例如,你运行过多个测试,其中部分失败,然后仅运行了成功的测试,则结果栏将完全显示绿色。 |
|
如果未显示任何测试,请确保已安装适配器,将"测试资源管理器"与你使用的测试框架连接起来。 有关更多信息,请参见将不同测试框架与"测试资源管理器"配合使用。 |
本演练演示如何使用 Microsoft 单元测试框架开发 C# 语言的受测试方法。 你可以将其轻松改写为其他语言,也可加以调整以使用其他测试框架,例如 NUnit。 有关更多信息,请参见使用不同的测试框架。
创建测试和方法
1 [TestMethod] 2 public void BasicRooterTest() 3 { 4 // Create an instance to test: 5 Rooter rooter = new Rooter(); 6 // Define a test input and output value: 7 double expectedResult = 2.0; 8 double input = expectedResult * expectedResult; 9 // Run the method under test: 10 double actualResult = rooter.SquareRoot(input); 11 // Verify the result: 12 Assert.AreEqual(expectedResult, actualResult, 13 delta: expectedResult / 100); 14 }
解决方案将生成并运行。
"测试资源管理器"将打开并显示结果。
测试显示在"失败的测试"下。
"测试资源管理器"的下半部分将显示测试的详细信息。
此时,你已创建了测试和存根,在此基础上进行修改以使测试通过。
在每次更改之后,都要使所有测试通过
1 public double SquareRoot(double input) 2 { 3 return input / 2; 4 }
代码将生成,测试运行。
测试通过。
添加测试以扩展输入的范围
|
避免修改已通过的现有测试。 相反,请添加新测试。 仅当用户需求变化时更改现有测试。 此策略有助于确保在扩展代码时不丢失现有功能。 |
在测试类中,添加以下测试,其中涉及到一系列输入值:
1 [TestMethod] 2 public void RooterValueRange() 3 { 4 // Create an instance to test: 5 Rooter rooter = new Rooter(); 6 // Try a range of values: 7 for (double expectedResult = 1e-8; 8 expectedResult < 1e+8; 9 expectedResult = expectedResult * 3.2) 10 { 11 RooterOneValue(rooter, expectedResult); 12 } 13 } 14 private void RooterOneValue(Rooter rooter, double expectedResult) 15 { 16 double input = expectedResult * expectedResult; 17 double actualResult = rooter.SquareRoot(input); 18 Assert.AreEqual(expectedResult, actualResult, 19 delta: expectedResult / 1000); 20 }
2.在"测试资源管理器"中,选择"全部运行"。
新测试失败,但第一个测试仍然通过。
若要查找失败位置,请选择失败的测试,然后在"测试资源管理器"的下半部分,选择"堆栈跟踪"顶部的项。
3.检查所测试的方法,以查明可能出错的地方。 在 MyMath.Rooter 类中,重写代码:
1 public double SquareRoot(double input) 2 { 3 double result = input; 4 double previousResult = -input; 5 while (Math.Abs(previousResult - result) > result / 1000) 6 { 7 previousResult = result; 8 result = result - (result * result - input) / (2 * result); 9 } 10 return result; 11 }
4.在"测试资源管理器"中,选择"全部运行"。
现在两个测试均通过。
为异常用例添加测试
1 [TestMethod] 2 public void RooterTestNegativeInputx() 3 { 4 Rooter rooter = new Rooter(); 5 try 6 { 7 rooter.SquareRoot(-10); 8 } 9 catch (ArgumentOutOfRangeException e) 10 { 11 return; 12 } 13 Assert.Fail(); 14 } 15
所测试的方法形成循环,必须手动取消。
测试在 10 秒后停止。
1 public double SquareRoot(double input) 2 { 3 if (input <= 0.0) 4 { 5 throw new ArgumentOutOfRangeException(); 6 } 7 8 ...
所有测试均通过。
在不更改测试的情况下重构代码
|
重构是旨在提高代码性能或易理解性的更改。 其目的不在于更改代码的行为,因此不更改测试。 我们建议你分开进行功能扩展和重构步骤。 保持测试不变,就能有信心在重构时不意外引入 bug。 |
1 public class Rooter 2 { 3 public double SquareRoot(double input) 4 { 5 if (input <= 0.0) 6 { 7 throw new ArgumentOutOfRangeException(); 8 } 9 double result = input; 10 double previousResult = -input; 11 while (Math.Abs(previousResult - result) > result / 1000) 12 { 13 previousResult = result; 14 esult = (result + input / result) / 2; 15 //was: result = result - (result * result - input) / (2*result); 16 } 17 return result; 18 } 19 }
所有测试仍然通过。
标签:
原文地址:http://www.cnblogs.com/BMFramework/p/4522159.html