四、附加测试属性
附加测试属性,在默认生成的测试代码是使被注释掉的,取消注释就可以使用。
例如,要在执行测试前,输出测试开始时间,在执行测试后,输出测试结束时间。代码如下:
[ClassInitialize()] public static void MyClassInitialize(TestContext testContext) { string begin = String.Format("测试开始时间:{0}", DateTime.Now.ToString()); using (System.IO.StreamWriter sw = new System.IO.StreamWriter(@"F:\1.txt", true)) { sw.WriteLine(begin); sw.Flush(); sw.Close(); } } [TestCleanup()] public void MyTestCleanup() { string end = String.Format("测试结束时间:{0}", DateTime.Now.ToString()); using (System.IO.StreamWriter sw = new System.IO.StreamWriter(@"F:\1.txt", true)) { sw.WriteLine(end); sw.Flush(); sw.Close(); } }
五、数据驱动的单元测试
数据驱动的单元测试是指单元测试的输入数据遍历一个数据源的所有行,从数据源的每一行读入数据并传入给测试方法使用。
1、Access数据驱动的单元测试
(1)在测试视图中右键单击需要配置成数据驱动方式的单元测试方法,点击“属性”。
(2)在“属性”窗口中,单击“数据连接字符串”属性项的“...”,打开“选择数据源”对话框。
(3)在“选择数据源”窗口中,选择“数据库”,点击“下一步”。
(4)点击“新建连接”,弹出“选择数据源”窗体,选择“Microsoft Access 数据库文件”后,点击“继续”。
(5)在“连接属性”界面中,点击“浏览”,选择要连接的Access数据库,点击“确定”。
(6)在“新建测试数据源向导中点击“下一步”,选择数据源中的数据表,点击“完成”,在自动生成的测试代码中增加了数据源信息。
(7)可通过修改测试方法属性中的“数据访问方法”为顺序的或随机,以配置数据访问方法。
(8)编写测试代码使用数据源。
通过TestContext类的DataRow和DataConnection属性将数据提供给正在运行的单元测试。
/// <summary> ///Add 的测试 ///</summary> [DataSource("System.Data.OleDb", "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Users\\Administrator\\Desktop\\Test\\Database1.accdb", "test", DataAccessMethod.Sequential), TestMethod()] public void AddTest() { TestClass target = new TestClass(); int a = int.Parse(TestContext.DataRow["a"].ToString()); int b = int.Parse(TestContext.DataRow["b"].ToString()); int expected = int.Parse(TestContext.DataRow["Result"].ToString()); int actual; actual = target.Add(a, b); Assert.AreEqual(expected, actual); //Assert.Inconclusive("验证此测试方法的正确性。"); }
Access数据源中的表为:
2、Excel数据驱动的单元测试
(1)修改“数据连接字符串”的数据源,在“连接属性”窗体中,点击“更改”,在“更改数据源”界面中修改数据源为“Microsoft ODBC 数据源”,点击“确定”。
(2)在“连接属性”界面中,选择“使用连接字符串”,点击“生成”。
(3)在“连接数据源”界面中,点击“新建”。
(4)在“创建新数据源”界面中,选择“Microsoft Excel Driver(*.xls)”,点击“下一步”。
(5)设置文件数据源的保存名称,点击“下一步”,直到“完成”。
(6)在“ODBC Microsoft Excel 安装”界面中,点击“选择工作簿”。
(7)在“选择工作簿”界面中,选择作为数据源的Excel文件,点击“确定”,直至回到“新建测试数据源向导”。
(8)点击“下一步”,选择Sheet表单,点击“完成”。
(9)编写测试代码使用数据源:
/// <summary> ///Add 的测试 ///</summary> [DataSource("System.Data.Odbc", "Driver={Microsoft Excel Driver (*.xls)};dbq=C:\\Users\\Administrator\\Desktop\\Test\\test.xls;defaultdir=C:\\Users\\Administrator\\Desktop\\Test;driverid=790;fil=excel 8.0;filedsn=D:\\我的资料库\\Documents\\data.dsn;maxbuffersize=2048;maxscanrows=8;pagetimeout=5;readonly=1;safetransactions=0;threads=3;uid=admin;usercommitsync=Yes", "Sheet1$", DataAccessMethod.Sequential), TestMethod()] public void AddTest() { TestClass target = new TestClass(); int a = int.Parse(TestContext.DataRow.ItemArray[0].ToString()); int b = int.Parse(TestContext.DataRow.ItemArray[1].ToString()); int expected = int.Parse(TestContext.DataRow.ItemArray[2].ToString()); int actual; actual = target.Add(a, b); Assert.AreEqual(expected, actual); //Assert.Inconclusive("验证此测试方法的正确性。"); }
六、常用断言方法
1、Assert类:用于断言
Assert.Inconclusive() 表示一个未验证的测试;
Assert.AreEqual() 测试指定的值是否相等,如果相等,则测试通过;
AreSame() 用于验证指定的两个对象变量是指向相同的对象,否则认为是错误;
AreNotSame() 用于验证指定的两个对象变量是指向不同的对象,否则认为是错误;
Assert.IsTrue() 测试指定的条件是否为True,如果为True,则测试通过;
Assert.IsFalse() 测试指定的条件是否为False,如果为False,则测试通过;
Assert.IsNull() 测试指定的对象是否为空引用,如果为空,则测试通过;
Assert.IsNotNull() 测试指定的对象是否为非空,如果不为空,则测试通过;
Assert.IsInstanceOfType 验证指定对象是否为指定类型的实例,如果是,则测试通过;
Assert.IsNotInstanceOfType 验证指定对象是否不为指定类型的实例,如果是,则测试通过;
Assert.Fail() 在不检查任何条件的情况下使断言失败;
Assert.ReplaceNullChars() 在字符串中,用"\\0"替换空字符('\0');
2、CollectionAssert类:用于验证对象集合是否满足条件
CollectionAssert.AllItemsAreInstancesOfType() 验证指定集合中的所有元素是否为指定类型的实例。
CollectionAssert.AllItemsAreNotNull() 验证指定集合中的所有项是否都不为 null。
CollectionAssert.AllItemsAreUnique() 验证指定集合中的所有项是否都唯一。 如果集合中有两个元素相等,则断言失败。
CollectionAssert.AreEqual() 验证两个指定的集合是否相等。 如果这两个集合不相等,则断言失败。
CollectionAssert.AreEquivalent() 验证两个指定的集合是否等效。
CollectionAssert.AreNotEqual() 验证两个指定的集合是否不相等。
CollectionAssert.AreNotEquivalent() 验证两个指定的集合是否不等效。
CollectionAssert.Contains() 验证指定的集合是否包含指定的元素。
CollectionAssert.DoesNotContain() 验证指定的集合是否不包含指定的元素。
CollectionAssert.IsNotSubsetOf() 验证第一个集合是否不是第二个集合的子集。
CollectionAssert.IsSubsetOf() 验证第一个集合是否为第二个集合的子集。
3、StringAssert类:用于比较字符串。
StringAssert.Contains 验证第一个字符串是否包含第二个字符串。
StringAssert.Matches 验证指定的字符串是否与正则表达式匹配。
StringAssert.DoesNotMatch 验证指定的字符串是否与正则表达式不匹配。
StringAssert.StartWith 验证第一个字符串是否以第二个字符串开头。
StringAssert.EndsWith 验证第一个字符串是否以第二个字符串结尾。