• Nunit单元测试入门学习随笔(一)


    Nunit单元测试

    一、插件安装与项目关联

    选择工具~扩展和更新

     

    点击联机~搜索Nunit安装图内三个插件

     

    新建单元测试项目

     

    勾选项目引用

     

    二、Nunit学习

    1、了解单元测试

    单元测试在我的理解是测试中针对可执行测试的最小单元,编写一个测试方法去检测开发人员的代码段甚至某个方法是否正确。判断在某个特定条件(场景)下,某个函数的行为是否符合预期期望。

    2、Nunit属性(划重点)

    先看一个简单的示例:

    using NUnit.Framework;

    using unitdemo;

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

    using System.Threading.Tasks;

    namespace unitdemo.Tests

    {

        [TestFixture()]

        public class ProgramTests

        {

            [Test()]

            public void AddTest3()

            {

                int a = 100;

                int b = 10;

                Assert.AreEqual(100,Program.Add(a, b));

            }

        }

    }

    测试类和测试方法前有TestFixtureTest属性,TestFixture表示需要测试的类,也就是说测试的单元,Test表示测试用例,也就是测试方法,NUint中的TestFixtureTest属性是我们最常用的属性。

    属性:

    Nunit属性

    说明

     

    TestFixture

    标记一个测试类:

    1、测试类必须是Public

    2、必须有一个缺省的构造函数,构造函数应该没有任何的副作用

     

    Test

    标记测试方法:

    1、方法必须没有参数

    2、方法必须是Public,返回值为void

    TestFixtureSetUp

    初始化整个类,在Nunit执行一次

    TestFixtureTearDown

    销毁,回收整个类,在Nunit执行一次

     

    SetUp

    作用是将测试方法中公用的部分抽取出来,单独组织成一个方法,避免代码的冗余。初始化方法,会在其他测试方法前首先被执行,在测试类中有多少方法就会被执行多少次,同样方法必须是Public

     

    TearDown

    回收,与SetUp对应,同样是在测试类中有多少个方法,TearDown 就会被执行多少次

    N/A

    标识测试用例说明

     

    Ignore

    标识忽略测试用例的说明,指示这个方法由于某些原因暂时不需要测试(比如没有完成相关代码),标记该测试方法不会在 NUnit 中执行,在 NUnit 运行时会执行该字符串,说明:不执行测试的原因等。

     

    Explicit

    [Ignore]属性类似,区别在于被[Ignore]属性忽略后的testtestFixture再想调用执行是不可能的,而[Explicit]支持显示选择执行。

    ExpectedException

    如果被标记的方法没有抛出期望的异常,测试无法通过。

    如:[ExpectedException(typeof(异常类型))]

    Category

    标识测试用例的分类

    3、断言(重点,内容较多,用多了就记住了)

    回顾一下属性下的实例代码里有这么一句“Assert.AreEqual(Program.Add(a, b), 110);”,这就是Nunit的断言其中的一种。断言也就是判断验证,在合适的地方设置断言进行判断是否得到我们想要的期望。

    注意:如果断言失败,方法将没有返回,并且报告一个错误;如果一个方法中包括了多个断言,在失败的断言之后的所有断言不会被继续执行。故,最好是为每个测试的断言使用try语句。

    常用的断言(必须要掌握的):

    断言

    说明

    示例

    Assert.AreEqual(object expected,objectactual[,string message])

    验证两个对象是否相等(Assert.AreNotEqual是否不相等)

    Assert.AreEqual(100,a+b)

    Assert.AreSame(object expected,objectactual[,string message])

    验证两个引用是否指向同一对象

    object expected = new object(); object actual = expected; Assert.AreSame(expected, actual)

    Assert.IsFalse(bool)

    验证bool值是否为false

    Assert.IsFalse(false)

    Assert.IsTrue(bool)

    验证bool值是否为true

    Assert.IsTrue(true)

    Assert.IsNotNull(object)

    验证对象是否不为null

    Assert.IsNotNull(new object())

    Assert.IsNull(object)

    验证对象是否为null

    Assert.IsNull(null)

    3.1、断言类介绍:

    Nunit一共有四个断言类,分别是AssertStringAssertFileAssertDirectoryAssert,它们都在NUnit.Framework命名空间,其中Assert是常用,也是我们最熟悉的,而另外三个断言类,顾名思义,分别对应于字符串的断言、文件的断言和目录的断言,理论上,仅Assert类就可以完成所有条件的判断,然而,如果合理的运用后面的三个断言,将使代码更加简洁、美观,也更加便于理解和维护。

    3.2Assert

    1、相等/不相等判断

    Int a=1

    Assert.AreEqual(a,1);//通过判断

    Assert.AreEqual(a,2);//不能通过判断

    除了Assert.AreEqual/Assert.AreNotEqual,下面几乎所有的方法都支持多态(多种数据类型),以及多参数

    这个断言还有一种典型的参数形式:

    Assert.AreEqual(110, Program.Add(a, b), "相等测试通过");

    Assert.AreEqual(100, Program.Add(a, b), "不相等测试不通过");

    第三个条件是测试不通过时输出的信息,便于定位错误

     

    对于doubledecimal类型,这两个方法还支持比较数的浮点误差

    Demo

    double A = 1.1;

    double B = 1.11;

    double C = 0.000009;

    Assert.AreEqual(A, B, C);//通过判断如果允许的数据的偏差在C,B-A<C就能通过

     

    2、类的判断

    AreSame(expected, actual, message):该断言判断actual和expected指向的是否是同一对象。如果不是同一对象则报告错误。

    AreNotSame(expected, actual, message):该断言判断actual和expected指向的是否是同一对象。如果是同一对象则报告错误。

    Contains(anObject, collection, message):

    anObject——一个对象;

    collection——一个数组或列表;

    message——发生错误时要报告的消息。

    该断言判断一个对象是否被包含在一个列表或数组里,也就是说这个对象是否是一个数据或列表的成员。如果不是报告错误。

    Demo

    List<string> list = new List<string>();

    list.Add("a");

    list.Add("b");

    Assert.Contains("a", list); //通过判断

    Assert.Contains("b", list); //通过判断

    Assert.Contains("ab", list); //不能通过判断

     

     

    3、条件判断

    IsTrue(bool condition, string message)

    IsFalse(bool condition, string message)

    IsNull(object anObject, string message)

    IsNotNull(object anObject, string message)

    IsNaN(double aDouble, string message)

    IsEmpty(string aString, string message)

    IsNotEmpty(string aString, string message):判断数值是Nan

    IsEmpty(ICollection collection, string message):判断字符串是否为空

    IsNotEmpty(ICollection collection, string message):判断字符串是否不为空

     

    4、比较判断

    Greater(arg1, arg2, message)arg1是否大于arg2

    GreaterOrEqual(arg1, arg2, message)arg1是否大于等于arg2

    Less(arg1, arg2, message)arg1是否小于arg2

    LessOrEqual(arg1, arg2, message)arg1是否小于大于arg2

    适用类型:int uint decimal float double

    5、类型判断

    IsInstanceOfType(expected, actual, message)

    IsNotInstanceOfType(expected, actual, message)

    该断言判断actual的类型是否就是expected所指定的类型。如不是/是则报告错误。

    expected——期望的对象的类型,接受一个type类型的参数;

    actual——对象;

    message——发生错误时要报告的消息。

    Demo

        public class Person

        {

            public string name{ set; get; }

        }

        class demo

        {

            [Test()]

            public void Test2()

            {

                Person r = new Person();

                r.name = "a";

                Assert.IsInstanceOf(typeof(Person), r);//通过判断

                Assert.IsInstanceOf(typeof(System.String), r);//不能通过判断

            }

        }

     

    6、异常判断

    Throws:应该抛出某类型的异常

    DoesNotThrow:不应该抛出某类型的异常

    7、其他常用的方法

    Pass:强行让测试通过

    Fail:强行让测试失败

    Ignore:忽略该测试方法

    Inconclusive:未验证该测试

    Assert.Pass();

    Assert.Pass(string message );

    Assert.Pass(string message, object[] parms );

    Assert.Fail();

    Assert.Fail(string message );

    Assert.Fail(string message, object[] parms );

    Assert.Ignore();

    Assert.Ignore(string message );

    Assert.Ignore(string message, object[] parms );

    Assert.Inconclusive();

    Assert.Inconclusive(string message );

    Assert.Inconclusive(string message, object[] parms );

    这些方法让我们能直接控制测试的进程,其中Assert.Pass 让你直接通过测试来结束这次的测试:这会导致一个异常产生,是高效的让测试返回的方法。除此之外,你也可以提供一个消息,让我们可以直观看出原因。

    Assert.Fail 可以让测试失败为结果来结束本次测试。

    Assert.Ignore 让我们有能力动态的忽略某个测试或条件。它可以在test,setup,fixture setup方法中调用。建议只在单独的条件内调用,因为Nunit的分类机制提供更广泛的如包含、排除等,你可以更简单的选择让测试运行在不同的场合或者程序集。

    Assert.Inconclusive 的作用是指出现有条件下,测试不能完成:因为它不能证明断言是成功或失败。

    这几个方法一样,即使把它放到一个独立的方法中,然后再调用这个方法,它仍然会被激发来结束测试

    3.3StringAssert

    StringAssert用于String类型的断言判断:

    StringAssert.Contains:是否包含子串

    StringAssert.StartsWith:是否以某子串开头

    StringAssert.EndsWith:是否以某子串结尾

    StringAssert.AreEqualIgnoringCase:两个字符串是否在不区分大小写时相等

    StringAssert.IsMatch:是否匹配,(使用正则表达式进行字符串比较)

    Demo:

                string s1 = "abc";

                StringAssert.Contains("b", s1);

                StringAssert.StartsWith("a", s1);

                StringAssert.EndsWith("c", s1);

                string s2 = "aBc";

                StringAssert.AreEqualIgnoringCase(s1, s2);

                StringAssert.IsMatch("[a|book]", "123");

    3.3CollectionAssert

    AllItemsAreInstancesOfType:集合中的各项是否是某某类型的实例

    AllItemsAreNotNull:集合中的各项均不为空

    AllItemsAreUnique:集合中的各项唯一

    AreEqual:两个集合相等

    AreEquivalent:两个集合相当

    AreNotEqual:两个集合不相等

    AreNotEquivalent:两个集合不相当

    DoesNotContain:集合中不包含某对象

    IsSubsetOf:一个集合是另外一个集合的子集

    IsNotSubsetOf:一个集合不是另外一个集合的子集

    IsEmpty:集合为空

    IsNotEmpty:集合不为空

    IsOrdered:集合的各项已经排序

    Demo

                List<int> a = new List<int>();

                List<int> b = new List<int>();

                CollectionAssert.IsEmpty(a);

                for (int i = 1; i <= 10; i++)

                {

                    a.Add(i);

                    b.Add(i);

                }

                CollectionAssert.AreEqual(a, b);

                CollectionAssert.IsOrdered(a);

                b.Remove(1);

                CollectionAssert.IsSubsetOf(b, a);

                CollectionAssert.AreEqual(a, b);

  • 相关阅读:
    【Javascript】javascript学习 二十二 JavaScript 对象简介
    【Javascript】javascript学习 二十六 JavaScript Boolean(逻辑)对象
    【Javascript】javascript学习 二十九 JavaScript HTML DOM 对象
    【Javascript】javascript学习 二十八 JavaScript RegExp 对象
    【Javascript】javascript学习 二十一 JavaScript 指导方针
    【Javascript】javascript学习 二十三 JavaScript 字符串(String)对象
    【Javascript】javascript学习 三十 JavaScript 浏览器检测
    【Javascript】javascript学习 二十五 JavaScript Array(数组)对象
    【Javascript】javascript学习 二十四 JavaScript Date(日期)对象
    【Javascript】javascript学习 二十七 JavaScript Math(算数)对象
  • 原文地址:https://www.cnblogs.com/ikbk/p/10024766.html
Copyright © 2020-2023  润新知