你学会测试了吗(3):测试语法之断言介绍

前言

这个简短的系列一一讲解一下.Net下测试的相关知识,希望对初学者有所帮助。

在这个系列第一篇中从测试工具入手推荐TestDriven.NET。官方下载TestDriven.NET-2.14.2190
Beta版(直接下载)和TestDriven.NET-2.13.2184正式版(直接下载)第二篇中我选择了最为经典的NUnit单元测试框架来介绍TestDriven.NET所支持的一些重要的属性。这一篇继续使用这个框架,介绍单元测试的核心——断言Assert。

概述

在测试框架中,断言是单元测试的核心,我们在测试中要对其程序断言,如果某个断言失败,方法的调用不会返回值,并且会报告一个错误。如果一个测试包含多个断言,那些紧跟失败断言的那些断言都不会执行,因此每个测试方法最好只有一个断言。

下面看看NUnit框架吧,来2张图:

断言

现在,我们使用经典的NUnit框架的最新版本,可以用三种方法来写我们的断言:

  • 标准模式:过去比较经典的写法。这些方法在NUnit.Framework命名空间下的Assert类中以静态方法提供,对其不同的类型(字符串、集合、文件)NUnit.Framework框架还提供了字符串断言、集合断言、文件断言。
  • 约束模式:全新的写法,使用Assert.That()方法来约束扩展所有的断言,使用新增NUnit.Framework.SyntaxHelpers命名空间下提供的方法调用NUnit.Framework.Constraints命名空间下的各种约束。
  • 继承模式:只要把测试的类继承NUnit.Framework.AssertionHelper类,可以使用Expect()方法来替换Assert.That()方法。

在这里,我把Assert方法分为:同等断言、一致性断言、比较断言、类型断言、条件测试、工具方法这6类,另外还有字符串断言、集合断言、文件断言。

当然按照约束方式,也可以大致分为Equal Constraint、Same As Constraint、Condition Constraints、Comparison Constraints、Type Constraints、String Constraints、Collection Constraints、Property Constraint、Compound Constraints、Custom Constraints、List Mapper等。

下面我依次介绍一下断言,使用三种方式来写自己的断言。

  • Equality Asserts(同等断言)
  • Identity Asserts(一致性断言)
  • Comparison Asserts(比较断言)
  • Type Asserts(类型断言)
  • Condition tests(条件测试)
  • Utility methods(工具方法)
  • StringAssert(字符串断言)
  • CollectionAssert(集合断言)
  • FileAssert(文件断言)
  • 其他约束

1.Equality Asserts、Equal Constraint

NUnit.Framework提供了Assert.AreEqual()、Assert.AreNotEqual()方法测试两个对象是否相等。方法支持相同类型,不同类型,多维数组,嵌套数组,集合类相互比较。

NUnit.Framework.AssertionHelper命名空间下提供了Is.EqualTo(object)方法使用同等约束条件来测试两个对象是否相等。当然了,我们继承NUnit.Framework.AssertionHelper类,可以使用Expect()方法来替换Assert.That()方法。下面给出这个例子:

注意:需要引用NUnit.Framework,NUnit.Framework.AssertionHelper,NUnit.Framework.Constraints命名空间,并把测试类继承AssertionHelper。

[Test]
public void EqualTest()
{
    //定义一些变量
    var i3 = new int[] { 1, 2, 3 };
    var d3 = new double[] { 1.0, 2.0, 3.0 };
    var iunequal = new int[] { 1, 3, 2 };
    var array2x2 = new int[,] { { 1, 2 }, { 3, 4 } };
    var array4 = new int[] { 1, 2, 3, 4 };
    var actual = new string[] { "HELLO", "world" };
    var expected = new string[] { "Hello", "World" };
    //经典语法
    Assert.AreEqual(4, 2 + 2);
    Assert.AreEqual(i3, d3);
    Assert.AreNotEqual(5, 2 + 2);
    Assert.AreNotEqual(i3, iunequal);
    //约束语法
    Assert.That(2 + 2, Is.EqualTo(4));
    Assert.That(2 + 2 == 4);
    Assert.That(2 + 2, Is.Not.EqualTo(5));
    Assert.That(2 + 2 != 5);
    Assert.That(5.0, Is.EqualTo(5));
    Assert.That(2.1 + 1.2, Is.EqualTo(3.3).Within(.0005));
    Assert.That(double.PositiveInfinity, Is.EqualTo(double.PositiveInfinity));
    Assert.That(double.NaN, Is.EqualTo(double.NaN));
    Assert.That(i3, Is.EqualTo(d3));
    Assert.That(i3, Is.Not.EqualTo(iunequal));
    Assert.That(array2x2, Is.EqualTo(array4).AsCollection); //成功
    Assert.That("Hello!", Is.EqualTo("HELLO!").IgnoreCase);
    Assert.That(actual, Is.EqualTo(expected).IgnoreCase);
    //使用继承语法
    Expect(2 + 2, EqualTo(4));
    Expect(2 + 2 == 4);
    Expect(i3, EqualTo(d3));
    Expect(2 + 2, Not.EqualTo(5));
    Expect(i3, Not.EqualTo(iunequal));
}

2.Identity Asserts、Same As Constraint

Assert.AreSame()和Assert.AreNotSame()方法测试两个对象是否是同一个对象。Assert.Contains方法用来测试在一个数组或列表里是否包含该对象。

NUnit.Framework.AssertionHelper命名空间下提供了Is.SameAs(object)方法使用Same As约束条件来测试两个对象是否是相同对象。使用继承也是如此。

[Test]
public void SameAsTest()
{
    //定义变量
    var ex1 = new Exception();
    var ex2 = ex1;
    var ex3 = new Exception();
    //约束语法
    Assert.That(ex2, Is.SameAs(ex1));
    Assert.That(ex3, Is.Not.SameAs(ex1));
    //使用继承语法
    Expect(ex2, SameAs(ex1));
    Expect(ex3, Not.SameAs(ex1));
}

3.Comparison Asserts、Comparison Constraints

NUnit.Framework框架为我们提供了下面四个方法:

  • Assert.Greater(x, y)方法用于测试一个对象是否大于另外一个对象。
  • Assert.GreaterOrEqual(x, y)方法用于测试一个对象是否大于等于另外一个对象。
  • Assert.Less(x, y)方法用于测试一个对象是否小于另外一个对象。
  • Assert.LessOrEqual(x, y)方法用于测试一个对象是否小于等于另外一个对象。

NUnit.Framework.AssertionHelper命名空间下提供了Is.GreaterThan(IComparable)、Is.GreaterThanOrEqualTo(IComparable)、Is.AtLeast(IComparable)、 Is.LessThan(IComparable)、Is.LessThanOrEqualTo(IComparable)、Is.AtMost(IComparable)方法使用比较约束条件来测试比较两个对象。使用继承也是如此。

[Test]
public void ComparisonTest()
{
    //经典语法
    Assert.Greater(7, 3);
    Assert.GreaterOrEqual(7, 3);
    Assert.GreaterOrEqual(7, 7);
    Assert.Less(3, 7);
    Assert.LessOrEqual(3, 7);
    Assert.LessOrEqual(3, 3);
    //约束语法
    Assert.That(7, Is.GreaterThan(3));
    Assert.That(7, Is.GreaterThanOrEqualTo(3));
    Assert.That(7, Is.AtLeast(3));
    Assert.That(7, Is.GreaterThanOrEqualTo(7));
    Assert.That(7, Is.AtLeast(7));
    Assert.That(3, Is.LessThan(7));
    Assert.That(3, Is.LessThanOrEqualTo(7));
    Assert.That(3, Is.AtMost(7));
    Assert.That(3, Is.LessThanOrEqualTo(3));
    Assert.That(3, Is.AtMost(3));
    //使用继承语法
    Expect(7, GreaterThan(3));
    Expect(7, GreaterThanOrEqualTo(3));
    Expect(7, AtLeast(3));
    Expect(7, GreaterThanOrEqualTo(7));
    Expect(7, AtLeast(7));
    Expect(3, LessThan(7));
    Expect(3, LessThanOrEqualTo(7));
    Expect(3, AtMost(7));
    Expect(3, LessThanOrEqualTo(3));
    Expect(3, AtMost(3));
}

4.Type Asserts、Type Constraints

Assert.IsAssignableFrom(),Assert.IsNotAssignableFrom(),Assert.IsInstanceOfType(),Assert.IsNotInstanceOfType()方法让我们可以构造一些关于对象类型的断言。

同理,NUnit.Framework.AssertionHelper命名空间下提供了Is.TypeOf(Type)、Is.InstanceOfType(Type)、Is.AssignableFrom(Type)方法使用类型约束条件来测试对象类型。使用继承也是如此。

[Test]
public void TypeTest()
{
    //经典语法
    Assert.AreEqual(typeof(string), "Hello".GetType());
    Assert.AreEqual("System.String", "Hello".GetType().FullName);
    Assert.AreNotEqual(typeof(int), "Hello".GetType());
    Assert.AreNotEqual("System.Int32", "Hello".GetType().FullName);
    Assert.IsInstanceOfType(typeof(string), "Hello");
    Assert.IsNotInstanceOfType(typeof(string), 5);
    Assert.IsAssignableFrom(typeof(string), "Hello");
    Assert.IsNotAssignableFrom(typeof(string), 5);
    //约束语法
    Assert.That("Hello", Is.TypeOf(typeof(string)));
    Assert.That("Hello", Is.Not.TypeOf(typeof(int)));
    Assert.That("Hello", Is.InstanceOfType(typeof(string)));
    Assert.That(5, Is.Not.InstanceOfType(typeof(string)));
    Assert.That("Hello", Is.AssignableFrom(typeof(string)));
    Assert.That(5, Is.Not.AssignableFrom(typeof(string)));
    //使用继承语法
    Expect("Hello", TypeOf(typeof(string)));
    Expect("Hello", Not.TypeOf(typeof(int)));
    Expect("Hello", InstanceOfType(typeof(string)));
    Expect(5, Not.InstanceOfType(typeof(string)));
    Expect("Hello", AssignableFrom(typeof(string)));
    Expect(5, Not.AssignableFrom(typeof(string)));
}

5.Condition Tests、Condition Constraints

测试框架提供了Assert.IsTrue,Assert.IsFalse,Assert.IsNaN,Assert.IsEmpty、Assert.IsNotEmpty,Assert.IsNull、Assert.IsNotNull方法分别用于测试两个对象是否正确,错误,非数字,(字符串或集合)空、非空,引用为空、引用不为空。

而NUnit.Framework.AssertionHelper命名空间也提供相类似的方法使用条件约束测试对象。直接看例子:

[Test]
public void ConditionTest()
{
    //定义变量
    double d = double.NaN;
    //经典语法
    Assert.IsNull(null);
    Assert.IsNotNull(42);
    Assert.IsTrue(2 + 2 == 4);
    Assert.IsFalse(2 + 2 == 5);
    Assert.IsNaN(d);
    Assert.IsEmpty("");
    Assert.IsNotEmpty("Hello!");
    Assert.IsEmpty(new bool[0]);
    Assert.IsNotEmpty(new int[] { 1, 2, 3 });
    //约束语法
    Assert.That(null, Is.Null);
    Assert.That(42, Is.Not.Null);
    Assert.That(2 + 2 == 4, Is.True);
    Assert.That(2 + 2 == 4);
    Assert.That(2 + 2 == 5, Is.False);
    Assert.That(d, Is.NaN);
    Assert.That("", Is.Empty);
    Assert.That("Hello!", Is.Not.Empty);
    Assert.That(new bool[0], Is.Empty);
    Assert.That(new int[] { 1, 2, 3 }, Is.Not.Empty);
    //使用继承语法
    Expect(null, Null);
    Expect(42, Not.Null);
    Expect(2 + 2 == 4, True);
    Expect(2 + 2 == 4);
    Expect(2 + 2 == 5, False);
    Expect(d, NaN);
    Expect("", Empty);
    Expect("Hello!", Not.Empty);
    Expect(new bool[0], Empty);
    Expect(new int[] { 1, 2, 3 }, Not.Empty);
}

6.Utility methods

我们想对测试有自定义控制,测试框架提供了两个实用方法:Assert.Fail()和Assert.Ignore()方法。这对于开发你自己的特定项目的断言,例如用于判断中它非常有用。

Assert.Fail()方法表示这个测试方法是一个失败方法,这个失败是基于其他方法没有封装的测试。

Assert.Ignore()方法表示这个测试方法是一个忽略的方法,在测试过程中,将忽略这个测试。

7.StringAssert、String Constraints

StringAssert类提供许多AreEqualIgnoringCase、Contains、StartsWith、EndsWith、IsMatch、Equals、ReferenceEquals方法,这些方法在检查字符串值时是有用的。

而NUnit.Framework.AssertionHelper命名空间也提供相类似的Text.Contains(string)、Text.DoesNotContain(string)、Text.StartsWith(string)、Text.DoesNotStartWith(string)、Text.EndsWith(string)、Text.DoesNotEndWith(string)、Text.Matches(string)、Text.DoesNotMatch(string) 方法使用字符串约束检查字符串。直接看例子:

[Test]
public void StringTest()
{
    //定义变量
    var phrase = "Hello World!";
    var array = new string[] { "abc", "bad", "dba" };
    var greetings = new string[] { "Hello!", "Hi!", "Hola!" };
    var passage = "Now is the time for all good men to come to the aid of their country.";
    var quotes = new string[] { "Never say never", "It‘s never too late", "Nevermore!" };
    //经典语法
    StringAssert.Contains("World", phrase);
    StringAssert.StartsWith("Hello", phrase);
    StringAssert.EndsWith("!", phrase);
    StringAssert.AreEqualIgnoringCase("hello world!", phrase);
    StringAssert.IsMatch("all good men", passage);
    StringAssert.IsMatch("Now.*come", passage);
    //约束语法
    //测试是否包含"World"
    Assert.That(phrase, Text.Contains("World"));
    Assert.That(phrase, Text.DoesNotContain("goodbye"));
    Assert.That(phrase, Text.Contains("WORLD").IgnoreCase);
    Assert.That(phrase, Text.DoesNotContain("BYE").IgnoreCase);
    Assert.That(array, Text.All.Contains("b"));
    //测试字符串是否以"Hello"开始
    Assert.That(phrase, Text.StartsWith("Hello"));
    Assert.That(phrase, Text.DoesNotStartWith("Hi!"));
    Assert.That(phrase, Text.StartsWith("HeLLo").IgnoreCase);
    Assert.That(phrase, Text.DoesNotStartWith("HI").IgnoreCase);
    Assert.That(greetings, Text.All.StartsWith("h").IgnoreCase);
    //测试字符串是否以"!"结束
    Assert.That(phrase, Text.EndsWith("!"));
    Assert.That(phrase, Text.DoesNotEndWith("?"));
    Assert.That(phrase, Text.EndsWith("WORLD!").IgnoreCase);
    Assert.That(greetings, Text.All.EndsWith("!"));
    Assert.That(phrase, Is.EqualTo("hello world!").IgnoreCase);
    Assert.That(phrase, Is.Not.EqualTo("goodbye world!").IgnoreCase);
    Assert.That(new string[] { "Hello", "World" },
        Is.EqualTo(new object[] { "HELLO", "WORLD" }).IgnoreCase);
    Assert.That(new string[] { "HELLO", "Hello", "hello" },
        Is.All.EqualTo("hello").IgnoreCase);
    //测试字符串是否同"all good men"相配
    Assert.That(passage, Text.Matches("all good men"));
    Assert.That(passage, Text.Matches("Now.*come"));
    Assert.That(passage, Text.DoesNotMatch("all.*men.*good"));
    Assert.That(passage, Text.Matches("ALL").IgnoreCase);
    Assert.That(quotes, Text.All.Matches("never").IgnoreCase);
    //使用继承语法
    //测试是否包含"World"
    Expect(phrase, Contains("World"));
    Expect(phrase, Not.Contains("goodbye"));
    Expect(phrase, Contains("WORLD").IgnoreCase);
    Expect(phrase, Not.Contains("BYE").IgnoreCase);
    Expect(array, All.Contains("b"));
    //测试字符串是否以"Hello"开始
    Expect(phrase, StartsWith("Hello"));
    Expect(phrase, Not.StartsWith("Hi!"));
    Expect(phrase, StartsWith("HeLLo").IgnoreCase);
    Expect(phrase, Not.StartsWith("HI").IgnoreCase);
    Expect(greetings, All.StartsWith("h").IgnoreCase);
    //测试字符串是否以"!"结束
    Expect(phrase, EndsWith("!"));
    Expect(phrase, Not.EndsWith("?"));
    Expect(phrase, EndsWith("WORLD!").IgnoreCase);
    Expect(greetings, All.EndsWith("!"));
    Expect(phrase, EqualTo("hello world!").IgnoreCase);
    Expect(phrase, Not.EqualTo("goodbye world!").IgnoreCase);
    Expect(new string[] { "Hello", "World" },
        EqualTo(new object[] { "HELLO", "WORLD" }).IgnoreCase);
    Expect(new string[] { "HELLO", "Hello", "hello" },
        All.EqualTo("hello").IgnoreCase);
    //测试字符串是否同"all good men"相配
    Expect(passage, Matches("all good men"));
    Expect(passage, Matches("Now.*come"));
    Expect(passage, Not.Matches("all.*men.*good"));
    Expect(passage, Matches("ALL").IgnoreCase);
    Expect(quotes, All.Matches("never").IgnoreCase);
}

8.CollectionAssert、Collection Constraints

CollectionAssert类提供许多方法,像AllItemsAreInstancesOfType、AllItemsAreNotNull、AllItemsAreUnique、AreEqual(相同对象和次序)、AreEquivalent(相同对象次序不同)、AreNotEqual、AreNotEquivalent、Contains、DoesNotContain、IsEmpty、IsNotEmpty、IsNotSubsetOf、IsSubsetOf、ReferenceEquals。这些方法在检查集合值和比较两个集合时是有用的。集合参数必须实现IEnumerable接口。

而NUnit.Framework.AssertionHelper命名空间也提供相类似的方法使用集合约束检查集合。下面用例子说明,一看就明白。

[Test]
public void AllItemsTests()
{
    //定义3个集合
    object[] ints = new object[] { 1, 2, 3, 4 };
    object[] doubles = new object[] { 0.99, 2.1, 3.0, 4.05 };
    object[] strings = new object[] { "abc", "bad", "cab", "bad", "dad" };
    //经典语法
    CollectionAssert.AllItemsAreNotNull(ints);//ints集合所有项不为空
    CollectionAssert.AllItemsAreInstancesOfType(ints, typeof(int));//ints集合所有项类型为int
    CollectionAssert.AllItemsAreInstancesOfType(strings, typeof(string));
    CollectionAssert.AllItemsAreUnique(ints);//ints集合所有项都是唯一的
    //Helper语法
    Assert.That(ints, Is.All.Not.Null);
    Assert.That(ints, Has.None.Null);
    Assert.That(ints, Is.All.InstanceOfType(typeof(int)));
    Assert.That(ints, Has.All.InstanceOfType(typeof(int)));
    Assert.That(strings, Is.All.InstanceOfType(typeof(string)));
    Assert.That(strings, Has.All.InstanceOfType(typeof(string)));
    Assert.That(ints, Is.Unique);
    Assert.That(strings, Is.Not.Unique);
    Assert.That(ints, Is.All.GreaterThan(0));
    Assert.That(ints, Has.All.GreaterThan(0));
    Assert.That(ints, Has.None.LessThanOrEqualTo(0));
    Assert.That(strings, Text.All.Contains("a"));
    Assert.That(strings, Has.All.Contains("a"));
    Assert.That(strings, Has.Some.StartsWith("ba"));
    Assert.That(strings, Has.Some.Property("Length", 3));
    Assert.That(strings, Has.Some.StartsWith("BA").IgnoreCase);
    Assert.That(doubles, Has.Some.EqualTo(1.0).Within(.05));
    //使用继承语法
    Expect(ints, All.Not.Null);
    Expect(ints, None.Null);
    Expect(ints, All.InstanceOfType(typeof(int)));
    Expect(strings, All.InstanceOfType(typeof(string)));
    Expect(ints, Unique);
    Expect(strings, Not.Unique);
    Expect(ints, All.GreaterThan(0));
    Expect(ints, None.LessThanOrEqualTo(0));
    Expect(strings, All.Contains("a"));
    Expect(strings, Some.StartsWith("ba"));
    Expect(strings, Some.StartsWith("BA").IgnoreCase);
    Expect(doubles, Some.EqualTo(1.0).Within(.05));
}

9.FileAssert

FileAssert类提供AreEqual、AreNotEqual方法来比较两个文件,文件可以作为Stream、FileInfo、指定的文件路径来操作。

10.其他约束

这些约束都是新增的,由于和经典的断言没有一致的分类,我把它们单独列出来了,也在这里说说。

10-1.Property Constraint

属性约束。由主要测试对象的属性。

[Test]
public void PropertyTest()
{
    //定义变量
    string[] array = { "abc", "bca", "xyz", "qrs" };
    string[] array2 = { "a", "ab", "abc" };
    ArrayList list = new ArrayList(array);
    //约束语法
    Assert.That(list, Has.Property("Count"));//是否有Count属性
    Assert.That(list, Has.No.Property("Length"));//是否没有Length属性
    Assert.That("Hello", Has.Property("Length", 5));//"Hello"的Length属性是否是5
    Assert.That("Hello", Has.Length(5));//"Hello"的Length属性是否是5
    Assert.That("Hello", Has.Property("Length").EqualTo(5));//"Hello"的Length属性是否是5
    Assert.That("Hello", Has.Property("Length").GreaterThan(3));//"Hello"的Length属性是否大于3
    Assert.That(array, Has.Property("Length", 4));
    Assert.That(array, Has.Length(4));
    Assert.That(array, Has.Property("Length").LessThan(10));
    Assert.That(array, Has.All.Property("Length", 3));//所有项Length属性是否是3
    Assert.That(array, Has.All.Length(3));
    Assert.That(array, Is.All.Length(3));
    Assert.That(array, Has.All.Property("Length").EqualTo(3));
    Assert.That(array, Is.All.Property("Length").EqualTo(3));
    Assert.That(array2, Has.Some.Property("Length", 2));
    Assert.That(array2, Has.Some.Length(2));
    Assert.That(array2, Has.Some.Property("Length").GreaterThan(2));
    Assert.That(array2, Is.Not.Property("Length", 4));
    Assert.That(array2, Is.Not.Length(4));
    Assert.That(array2, Has.No.Property("Length").GreaterThan(3));
    Assert.That(List.Map(array2).Property("Length"), Is.EqualTo(new int[] { 1, 2, 3 }));
    Assert.That(List.Map(array2).Property("Length"), Is.EquivalentTo(new int[] { 3, 2, 1 }));
    Assert.That(List.Map(array2).Property("Length"), Is.SubsetOf(new int[] { 1, 2, 3, 4, 5 }));
    Assert.That(List.Map(array2).Property("Length"), Is.Unique);
    Assert.That(list, Has.Count(4));
    //继承语法
    Expect(list, Property("Count"));
    Expect(list, Not.Property("Nada"));
    Expect("Hello", Property("Length", 5));
    Expect("Hello", Length(5));
    Expect("Hello", Property("Length").EqualTo(5));
    Expect("Hello", Property("Length").GreaterThan(0));
    Expect(array, Property("Length", 4));
    Expect(array, Length(4));
    Expect(array, Property("Length").LessThan(10));
    Expect(array, All.Property("Length", 3));
    Expect(array, All.Length(3));
    Expect(array, All.Property("Length").EqualTo(3));
    Expect(array2, Some.Property("Length", 2));
    Expect(array2, Some.Length(2));
    Expect(array2, Some.Property("Length").GreaterThan(2));
    Expect(array2, None.Property("Length", 4));
    Expect(array2, None.Length(4));
    Expect(array2, None.Property("Length").GreaterThan(3));
    Expect(Map(array2).Property("Length"), EqualTo(new int[] { 1, 2, 3 }));
    Expect(Map(array2).Property("Length"), EquivalentTo(new int[] { 3, 2, 1 }));
    Expect(Map(array2).Property("Length"), SubsetOf(new int[] { 1, 2, 3, 4, 5 }));
    Expect(Map(array2).Property("Length"), Unique);
    Expect(list, Count(4));
}

10-2.Compound Constraints

进行对象间的比较。由几个方法复合作用。

[Test]
public void CompoundTest()
{
    //约束语法
    Assert.That(2 + 2, Is.Not.EqualTo(5));
    Assert.That(new int[] { 1, 2, 3 }, Is.All.GreaterThan(0));
    Assert.That(2.3, Is.GreaterThan(2.0) & Is.LessThan(3.0));
    Assert.That(3, Is.LessThan(5) | Is.GreaterThan(10));
    //继承语法
    Expect(2 + 2, Not.EqualTo(5));
    Expect(2.3, GreaterThan(2.0) & LessThan(3.0));
}

10-3.List Mapper

集合映射,比如下面的例子,测试strings数组对应项的Length属性是否为lengths对应项的值。

[Test]
public void ListMapperTest()
{
    //定义2个数组
    string[] strings = new string[] { "a", "ab", "abc" };
    int[] lengths = new int[] { 1, 2, 3 };
    //约束语法
    Assert.That(List.Map(strings).Property("Length"),
           Is.EqualTo(lengths));
    Assert.That(new ListMapper(strings).Property("Length"),
           Is.EqualTo(lengths));
    //继承语法
    Expect(Map(strings).Property("Length"), EqualTo(lengths));
}

结束语

关于这篇测试语法断言介绍,由于断言很多,很难在一篇文章中把所有的断言学习到。之前,我也想考虑分为经典模式和约束模式来介绍,发现大致相同,也浪费大量时间,所以千思万想,把这些属性整合在一起综合介绍,带着丰富的例子,相信可以掌握这些断言。考虑到本节代码过多,还有一部分还没有贴出来,提供下载。地址为:YJingLee.Test.zip(VS2008项目,如果你是VS2005只需复制其中的测试文件到你的项目中即可)

版权声明:本文为博主http://www.zuiniusn.com原创文章,未经博主允许不得转载。

时间: 2024-10-18 22:14:01

你学会测试了吗(3):测试语法之断言介绍的相关文章

linux命令中bash常用的条件测试:整数测试eq,文件测试-e,字符串测试==

测试方法:expression: 表达,表示 [ expression ] [[ expression ]] test expression  bash中常用的条件测试有三种:  1.整数测试:      -eq 等于      -lt 小于      -ne 不等于      -gt 大于      -le 小于等于      -ge 大于等于 integer:整数      INTEGER1=63     INTEGER2=77     [ $INTEGER1 -eq $INTEGER2 ]

[转帖]linux下CPU、内存、IO、网络的压力测试,硬盘读写速度测试,Linux三个系统资源监控工具

linux下CPU.内存.IO.网络的压力测试,硬盘读写速度测试,Linux三个系统资源监控工具 https://blog.51cto.com/hao360/1587165 linux_python关注0人评论57974人阅读2014-12-06 20:17:16 一.对CPU进行简单测试: 1.通过bc命令计算特别函数 例:计算圆周率 echo "scale=5000; 4*a(1)" | bc -l -q MATH LIBRARY        If bc is invoked w

Web端测试和移动端测试的区别

之前参加的项目有涉及Web端测试和移动端测试,简单的记录下他们之间的区别: 1.记录bug 在Web端可以通过系统自带的截图和QQ截图等方式来截取bug的图片,对于错误的地方可以用工具自带的标识来重点标记. 对于移动端设备可以用手机自带的截图工具来截图然后传到电脑上,个人一般习惯安装微信的windows版本,通过文件传输助手发送到PC端.还有一种比较便捷的方式,将手机用数据线连接到电脑,本地配置android的运行环境,下载asm.jar,在cmd运行java -jar asm.jar,即可实时

深入理解软件测试应用(测试用例+测试应用+测试技术及工具+测试等级)

我这里有个课程想和大家分享,有兴趣的朋友可以加我的QQ2059055336和我联系. 本课程为软件测试课程,主要讲述内容:软件测试概述.软件测试过程.软件测试技术.软件测试的应用.自动化测试技术等软件测试前言和问题的提出                             问题的提出 1课时                            基本概念                             本课程的主要内容                             各部分的

Web测试要点 做移动端的测试,也做web端的测试,甚至后面桌面端的测试和后台的测试也做了,基本上把我们产品各个端都玩了一轮

Web测试要点 一.功能测试 1.链接测试 (1).测试所有链接是否按指示的那样确实链接到了该链接的页面:  (2).测试所链接的页面是否存在:  (3).保证Web应用系统上没有孤立的页面(所谓孤立页面是指没有链接指向该页面,只有知道正确的URL地址才能访问). 2.表单测试(1).注册.登陆.信息提交等,必须测试提交操作的完整性,以校验提交给服务器的信息的正确性:(2).用户填写的出生日期与职业是否恰当,填写的所属省份与所在城市是否匹配等:  (3).检验默认值的正确性:(4).如表单只能接

web测试-Xenu死链接测试结果说明

xenu工具使用 使用xenu工具测试结束,显示有测试结果,其中红色的为测试有误的网站. 详细使用,见附件(使用xenu自动检测网站死链-豆联军). 作者:豆联军 email:[email protected] 教程文档包含的内容: 1.非登陆状态下,自动测试宣传类页面 2.使用post方式自动登录,测试网站会员页面 3.如何跳过带图形校验码的网站登录页,测试网站会员页面 测试状态: ok.mail host ok :表示链接正常; timeout.no connection.no such h

使用iozone测试磁盘性能(测试文件读写)

IOzone是一个文件系统测试基准工具.可以测试不同的操作系统中文件系统的读写性能.可以通过 write, re-write, read, re-read, random read, random write, random mix, backwards read, record rewirte, strided read, fwrite, frewrite, fread, freread, mmap, async I/0 等不同的模式下的硬盘的性能.测试的时候请注意,设置的测试文件的大小一定要

15问答为专业测试人员揭开“精准测试”的面纱

 15问答为专业测试人员揭开"精准测试"的面纱 什么是精准测试?软件测试是否必要达到精准?精准的同时是否提高了测试成本?精准测试对于普通测试工程师乃至测试行业会有怎样的影响?让我们带着这一系列的问题来关注精准测试的15个问答,揭开精准测试的面纱. 1.到底什么是精准测试?它和传统测试的区别和联系 相对于普通测试,精准测试是在传统测试过程中,通过技术手段对被测程序进行360度全景测试,将测试过程可视化.数字化.标准化,从而达到被测程序上线稳定.无风险.维护成本低等优势. 和传统测试比起来

web安全测试---跨站点脚本测试

1.1      跨站脚本测试 1.1.1        GET方式跨站脚本测试 编号 SEC_Web_XSS_01 测试用例名称 GET方式跨站脚本测试 测试目的 由于跨站脚本会导致会话被劫持.敏感信息泄漏.账户被盗,严重时甚至造成数据修改.删除,从而导致业务中断,因此需检测跨站脚本是否存在 用例级别 1 测试条件 1.  Web业务运行正常 2.  已知待测目标URL,假设为http://www.exmaple.com/page.xxx 3.  待测目标存在参数输入,假设为name=valu