zoukankan      html  css  js  c++  java
  • 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 之 Ajax
    Javascript 之 事件
    流程控制语句
    JS属性操作
    JS效果的步骤
    遍历Map的四种方法
    自动删除ftp自动保存的密码
    IE6下png格式透明图片显示灰色的解决办法.
  • 原文地址:https://www.cnblogs.com/ikbk/p/10024766.html
Copyright © 2011-2022 走看看