接下来就可以创建测试了:
1 namespace Explorations 2 { 3 [TestClass] 4 public class ExampleTest 5 { 6 private PrivateObject privateObject; 7 const string PASSWORD = "letmein"; 8 9 [TestInitialize] 10 public void TestInitialize() 11 { 12 privateObject = new PrivateObject(typeof(Example)); 13 } 14 15 [TestMethod] 16 public void ComparePrivatePassword() 17 { 18 string password = (string)privateObject.GetField("password"); 19 Assert.AreEqual(PASSWORD, password); 20 } 21 22 [TestMethod] 23 public void TestPrivateVerifyPassword() 24 { 25 bool accepted = (bool)privateObject.Invoke("VerifyPassword", PASSWORD); 26 Assert.IsTrue(accepted); 27 } 28 } 29 } |
由于PrivateClass使用了反射,因此,必须将调用结果从通用Object类型转换成正确的类型。
PrivateObject用于访问类的实例成员,如果要访问非公有静态成员,则需要用到PrivateType类,它的接口与PrivateObject非常类似,也对反射代码进行了封装。
Visual Studio单元测试功能全面支持代码覆盖,代码覆盖会自动插入跟踪逻辑(插装过程)以监视测试执行过程中哪些代码执行到了。它最重要的作用就是发现那些在测试中没有涉及到的代码段。
说明单元测试的有效性的一条原则是,删除任何一行代码都会导致至少一个单元测试的失败。
启用代码覆盖并选中了要插装的程序集之后,接下来运行测试,从Code Coverage Results窗口中可以浏览覆盖的结果:
100%的代码覆盖并不意味着单元测试已充分了,正确的测试需要使用不同的数据对相同的代码进行多次测试。代码覆盖是测试有效性的一种度量手段,但肯定不是唯一的。
使用测试影响分析可以在修改代码之后浏览哪些测试受到了代码更改的影响,这不仅限于单元测试,甚至适用于那些先前已执行的针对某个生成的手动测试。
在使用测试影响分析之前,首先必须在VS内使用单元测试框架,并将源代码存储在TFS Version Control中,然后在运行单元测试时启用数据收集功能。如果单元测试是在本地或通过MTM(Microsoft Team Manager)运行的,那么就必须将测试结果上传到TFS并将其与一个团队生成相关联之后才能进行测试影响分析。这里不做过多介绍。