iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >怎样使用xUnit为.net core程序进行单元测试
  • 328
分享到

怎样使用xUnit为.net core程序进行单元测试

2023-06-19 10:06:39 328人浏览 八月长安
摘要

怎样使用xUnit为.net core程序进行单元测试,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一. 导读为什么要编写自动化测试程序(Automated Tests)?可以

怎样使用xUnit为.net core程序进行单元测试,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

一. 导读

为什么要编写自动化测试程序(Automated Tests)?

  • 可以频繁的进行测试

  • 可以在任何时间进行测试,也可以按计划定时进行,例如:可以在半夜进行自动测试。

  • 肯定比人工测试要快。

  • 可以更快速的发现错误。

  • 基本上是非常可靠的。

  • 测试代码与生产代码紧密结合。

  • 使得开发团队更具有幸福感!

自动化测试的分类:

怎样使用xUnit为.net core程序进行单元测试

纵轴表示测试的深度,也就是说测试的细致程度。

横轴则表示测试的覆盖程度。

  • Unit Test 单元测试, 它可以测试一个类,或者一个类的某个功能,它具有很好的深度,但是对整个应用来说它不具备很好的覆盖面。

  • Integration Test 集成测试,它没有单元测试那么细致,但是具有相对较好的测试覆盖面。例如它可以测试功能的组合,以及像数据库或文件系统这样的外部资源等。

  • Subcutaneous Test 皮下测试,这种测试作用于UI层的下面一层,这也意味着它对整个应用来说有很好的覆盖率,但是深度欠佳。那一个mvc结构的应用来说,它就是针对刚好在Controller下面一层的测试,对于WEB service来说,它就是对节点下面那层的测试。

  • UI测试,它的测试覆盖面很广,直接从UI层面进行测试,但是深度欠佳。

从速度来看 单元是最快的,而UI测试是最慢的。

从脆弱性来看 UI测试是最差的,程序修改后极有可能需要修改测试代码,而单元测试是最好的。

是测试行为还是测试私有方法(private method)?

public void IncreaseHeartBeatRate()

        {

            HeartBeatRate = CalculateHeartBeatRate() + 2;

        }

        private int CalculateHeartBeatRate()

        {

            var random = new Random();

            return random.Next(1, 100);

        }

大多数情况下单元测试都应该是针对类的行为进行测试的,也就是public方法。当然也纯在不同的观点。

如果想要对private方法进行测试的话,是有很多缺点的:

  • 首先需要修改方法的访问限制需要从private改为public,这就破坏了面向对象的封装性。

  • 再者,这其实测试的是类的具体实现细节,而不是类的行为。如果我们想要对类的内部进行重构的话,就会破坏测试,导致测试也必须重构。如果必须对private方法进行测试,那么首先建议您把private修饰符改成internal,然后修改该项目(project)的AssemblyInfo.cs,它在项目的Debug或者Release文件夹下。代码如下:

[assembly: InternalsVisibleTo("Hospital.Tests")]

这表示Hospital.Tests这个测试项目可以访问该项目生产代码(production code)的internal方法。

测试的三个阶段 AAA

怎样使用xUnit为.net core程序进行单元测试

  • Arrange,这里做一些先决的设定。例如创建对象实例,数据,输入等等。

  • Act,在这里执行生产代码并返回结果。例如调用方法,或者设置属性(Properties)。

  • Assert,在这里检查结果。测试通过或者失败。

xUnit.net

官网:https://xunit.GitHub.io/

怎样使用xUnit为.net core程序进行单元测试

xUnit是一个测试框架,可以针对.net/core进行测试。

测试项目需引用被项目从而对其进行测试,测试项目同时需要引用xUnit库。测试编写好后,用Test Runner来运行测试。Test Runner可以读取测试代码,并且会知道我们所使用的测试框架,然后执行,并显示结果。目前可用的Test Runner包括vs自带的Test Explorer,或者dotNet Core命令行,以及第三方工具,例如resharper等等。

xUnit支持的平台:

.net full, .net core, .net standard, UWP, xamarin.

xUnit的例子:

[Fact]

        public void TestIncreaseHeartBeatRate()

        {

            var patient = new Patient(); // Arrange

            patient.IncreaseHeartBeatRate(); // Act

            Assert.InRange(patient.HeartBeatRate, 40, 100); // Assert

        }

安装配置xUnit.net

a.使用Visual Studio 2017

首先建立一个C# library项目,叫Hospital(下面部分截图有个拼写错误,应该是Hospital),然后建立一个xUnit Test项目,叫Hospital.Tests:

 怎样使用xUnit为.net core程序进行单元测试

可以看到Hospital.Tests已经包含里这几个库:

怎样使用xUnit为.net core程序进行单元测试

然后为Hospital.Tests添加到Hospital项目的引用。

b.使用.net core 命令行

首先把刚才建立的Hospital.Tests项目移除(目录需要手动删除).

然后打开项目位置:

怎样使用xUnit为.net core程序进行单元测试

按住shift打开命令行:

怎样使用xUnit为.net core程序进行单元测试

用命令行创建项目:

怎样使用xUnit为.net core程序进行单元测试

创建 Hospital.Tests目录,进入目录,使用命令dotnet new xunit创建xUnit单元测试项目。

添加项目的引用:

怎样使用xUnit为.net core程序进行单元测试

最后添加项目到解决方案:

怎样使用xUnit为.net core程序进行单元测试

回到VS界面,提示重新加载:

怎样使用xUnit为.net core程序进行单元测试

确认后,VS中解决方案结构如:

怎样使用xUnit为.net core程序进行单元测试

做第一个测试

对测试项目的文件名进行一些重构,编写以下代码,并进行Build:

怎样使用xUnit为.net core程序进行单元测试

从Test Explorer我们可以看到一个待测试的项目。

在这里,我们可以对测试项目进行分组和排序,如图:

怎样使用xUnit为.net core程序进行单元测试

想要运行所有的测试,就点击上面的Run All按钮。如果像运行单个测试,那么右击选择Run Selected Tests:

怎样使用xUnit为.net core程序进行单元测试

运行后,可以看到结果,Passed:

怎样使用xUnit为.net core程序进行单元测试

我们同样可以通过命令行来进行测试:

进入到Tests目录,执行 dotnet test命令,所有的测试都会被发现,然后被执行:

怎样使用xUnit为.net core程序进行单元测试

因为我们并没有在测试方法中写任何的Assert,所以测试肯定是通过的,但这个测试也是个无效的测试。

Assert

Assert做什么?Assert基于代码的返回值、对象的最终状态、事件是否发生等情况来评估测试的结果。Assert的结果可能是Pass或者Fail。如果所有的asserts都pass了,那么整个测试就pass了;如果有任何assert fail了,那么测试就fail了。

xUnit提供了以下类型的Assert:

  • boolean:True/False

  • String:相等/不等,是否为空,以..开始/结束,是否包含子字符串,匹配正则表达式

  • 数值型:相等/不等,是否在某个范围内,浮点的精度

  • Collection:内容是否相等,是否包含某个元素,是否包含满足某种条件(predicate)的元素,是否所有的元素都满足某个assert

  • Raised events:Custom events,Framework events(例如:PropertyChanged)

  • Object Type:是否是某种类型,是否某种类型或继承与某种类型

一个test里应该有多少个asserts?

一种建议的做法是,每个test方法里面只有一个assert。

而还有一种建议就是,每个test里面可以有多个asserts,只要这些asserts都是针对同一个行为就行。

第一个Assert

目标类:

public class Patient

    {

        public Patient()

        {

            IsNew = true;

        }

        public string FirstName { get; set; }

        public string LastName { get; set; }

        public string FullName => $"{FirstName} {LastName}";

        public int HeartBeatRate { get; set; }

        public bool IsNew { get; set; }

        public void IncreaseHeartBeatRate()

        {

            HeartBeatRate = CalculateHeartBeatRate() + 2;

        }

        private int CalculateHeartBeatRate()

        {

            var random = new Random();

            return random.Next(1, 100);

        }

    }

测试类:

public class PatientShould

    {

        [Fact]

        public void HaveHeartBeatWhenNew()

        {

            var patient = new Patient();

            Assert.True(patient.IsNew);

        }

    }

运行测试:

 怎样使用xUnit为.net core程序进行单元测试

结果符合预期,测试通过。

改为Assert.False()的话:

怎样使用xUnit为.net core程序进行单元测试

测试Fail。

String Assert

测试string是否相等

       [Fact]

        public void CalculateFullName()

        {

            var p = new Patient

            {

                FirstName = "Nick",

                LastName = "Carter"

            };

            Assert.Equal("Nick Carter", p.FullName);

        }

然后你需要Build一下,这样VS Test Explorer才能发现新的test。

运行测试,结果Pass:

怎样使用xUnit为.net core程序进行单元测试

同样改一下Patient类(别忘了Build一下),让结果失败:

怎样使用xUnit为.net core程序进行单元测试

从失败信息可以看到期待值和实际值。

StartsWith, EndsWith

[Fact]

        public void CalculateFullNameStartsWithFirstName()

        {

            var p = new Patient

            {

                FirstName = "Nick",

                LastName = "Carter"

            };

            Assert.StartsWith("Nick", p.FullName);

        }

        [Fact]

        public void CalculateFullNameEndsWithFirstName()

        {

            var p = new Patient

            {

                FirstName = "Nick",

                LastName = "Carter"

            };

            Assert.EndsWith("Carter", p.FullName);e);

        }

Build,然后Run Test,结果Pass:

怎样使用xUnit为.net core程序进行单元测试

忽略大小写 ignoreCase

string默认的Assert是区分大小写的,这样就会失败:

怎样使用xUnit为.net core程序进行单元测试

可以为这些方法添加一个参数ignoreCase设置为true,就会忽略大小写:

怎样使用xUnit为.net core程序进行单元测试

包含子字符串 Contains

       [Fact]

        public void CalculateFullNameSubstring()

        {

            var p = new Patient

            {

                FirstName = "Nick",

                LastName = "Carter"

            };

            Assert.Contains("ck Ca", p.FullName);

        }

Build,测试结果Pass。

正则表达式,Matches

测试一下First name和Last name的首字母是不是大写的:

[Fact]

        public void CalculcateFullNameWithTitleCase()

        {

            var p = new Patient

            {

                FirstName = "Nick",

                LastName = "Carter"

            };

            Assert.Matches("[A-Z]{1}{a-z}+ [A-Z]{1}[a-z]+", p.FullName);

        }

Build,测试通过。

数值 Assert

首先为Patient类添加一个property: BloodSugar。

public class Patient

    {

        public Patient()

        {

            IsNew = true;

            _bloodSugar = 5.0f;

        }

        private float _bloodSugar;

        public float BloodSugar

        {

            get { return _bloodSugar; }

            set { _bloodSugar = value; }

        }

        ...

Equal:

        [Fact]

        public void BloodSugarStartWithDefaultValue()

        {

            var p = new Patient();

            Assert.Equal(5.0, p.BloodSugar);

        }

Build,测试通过。

范围, InRange:

首先为Patient类添加一个方法,病人吃饭之后血糖升高:

public void HaveDinner()        {          
            var random = new Random();            _bloodSugar += (float)random.Next(1, 1000) / 100; //  应该是1000}

添加test:

          [Fact]

        public void BloodSugarIncreaseAfterDinner()

        {

            var p = new Patient();

            p.HaveDinner();

            // Assert.InRange<float>(p.BloodSugar, 5, 6);

            Assert.InRange(p.BloodSugar, 5, 6);

        }

Build,Run Test,结果Fail:

怎样使用xUnit为.net core程序进行单元测试

可以看到期待的Range和实际的值,这样很好。如果你使用Assert.True(xx >= 5 && xx <= 6)的话,错误信息只能显示True或者False。

因为HaveDinner方法里,表达式的分母应该是1000,修改后,Build,Run,测试Pass。

看完上述内容,你们掌握怎样使用xUnit为.net core程序进行单元测试的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网精选频道,感谢各位的阅读!

--结束END--

本文标题: 怎样使用xUnit为.net core程序进行单元测试

本文链接: https://www.lsjlt.com/news/295514.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎样使用xUnit为.net core程序进行单元测试
    怎样使用xUnit为.net core程序进行单元测试,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一. 导读为什么要编写自动化测试程序(Automated Tests)?可以...
    99+
    2023-06-19
  • 如何使用xUnit为.net core程序进行单元测试
    这篇文章主要介绍“如何使用xUnit为.net core程序进行单元测试”,在日常操作中,相信很多人在如何使用xUnit为.net core程序进行单元测试问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使...
    99+
    2023-06-19
  • .Net使用Xunit工具进行单元测试
    不管你爱与不爱,单元测试对于一个软件的长治久安还是必不可少的一环。在Visual Studio 2012后,VS中的测试浏览器也能与第三方的集成了,用起来还是非常方便的。目前在.Ne...
    99+
    2024-04-02
  • ASP.NET Core项目使用xUnit进行单元测试
    目录一、前言二、创建示例项目1、UnitTest.Model2、UnitTest.Data3、UnitTest.IRepository4、UnitTest.Repository5、U...
    99+
    2024-04-02
  • .Net怎么使用Xunit工具进行单元测试
    本篇内容介绍了“.Net怎么使用Xunit工具进行单元测试”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!安装Xunit:Xunit的安装现在...
    99+
    2023-07-02
  • ASP.NET Core项目如何使用xUnit进行单元测试
    小编给大家分享一下ASP.NET Core项目如何使用xUnit进行单元测试,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、前言在以前的.NET Fr...
    99+
    2023-06-29
  • C#使用MSTest进行单元测试
    我之前写过一篇XUNit的简介:使用Xunit来进行单元测试。Xunit在当时确实是一个最简单易用的测试框架,然而,随着发展,Xunit也变得复杂了不少,光写一个最简单的测试就要导入...
    99+
    2024-04-02
  • C#怎么使用MSTest进行单元测试
    今天小编给大家分享一下C#怎么使用MSTest进行单元测试的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。目前MS发布了两个版...
    99+
    2023-07-02
  • 使用 Go 泛型进行单元测试
    使用 go 泛型进行单元测试,可以创建适用于多种类型的通用测试函数,提高测试代码的可重用性、可维护性和可读性。具体优势包括:可重用性:泛型测试函数适用于多种类型,减少重复代码。可维护性:...
    99+
    2024-05-03
    单元测试 泛型 代码可读性
  • 如何使用 PHP 进行单元测试?
    单元测试检查软件的最小构成部分(如函数、方法),php 可通过 phpunit 框架进行单元测试。首先安装 phpunit,然后创建测试类(扩展自 testcase),再编写以 "tes...
    99+
    2024-04-19
    php 单元测试 composer
  • C++中怎么使用CppUnit进行单元测试
    这篇文章主要讲解了“C++中怎么使用CppUnit进行单元测试”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++中怎么使用CppUnit进行单元测试”吧!如果使用VC6,那么直接用VC6打...
    99+
    2023-06-17
  • 使用Spring Boot进行单元测试详情
    目录前言使用 Spring Boot 进行测试系列文章依赖项不要在单元测试中使用Spring创建一个可测试的类实例属性注入是不好的提供一个构造函数减少模板代码使用Mockito来模拟...
    99+
    2024-04-02
  • 如何使用MockMvc进行controller层单元测试
    这篇文章主要介绍了如何使用MockMvc进行controller层单元测试,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。看代码吧~package com.ieou....
    99+
    2023-06-15
  • 如何使用单元测试框架对 Golang 函数进行测试?
    go 中使用单元测试框架进行单元测试:导入 testing 包。编写以 test 为前缀的单元测试函数。使用断言函数(如 assertequal())验证测试结果。运行单元测试(go t...
    99+
    2024-04-16
    golang 单元测试 标准库
  • 如何使用 Go 标准库进行单元测试
    go 标准库通过 testing 包提供了单元测试功能,只需创建 _test.go 文件并编写测试函数即可。测试函数使用断言函数,如 assertequal 和 asserttrue,比...
    99+
    2024-04-30
    单元测试 标准库
  • Java使用Junit4.jar进行单元测试的方法
    目录一、下载依赖包二、添加到依赖三、设置 test 目录四、创建测试类五、开始测试一、下载依赖包 分别下载 junit.jar 以及 hamcrest-core.jar 二、添加到依...
    99+
    2024-04-02
  • 如何使用 PHPUnit 进行 PHP 函数单元测试?
    要进行 php 函数单元测试,可以使用 phpunit,步骤如下:创建测试类文件,扩展 phpunit\framework\testcase。为要测试的函数编写以 "test" 开头的测...
    99+
    2024-04-17
    php 单元测试
  • C#中如何使用单元测试框架进行自动化测试
    C#中如何使用单元测试框架进行自动化测试引言:在软件开发过程中,自动化测试是一个非常重要的环节。通过编写和运行测试代码,可以帮助我们验证和确保代码的正确性和稳定性。在C#开发中,我们可以使用单元测试框架来实现自动化测试。本文将介绍C#中常用...
    99+
    2023-10-22
    自动化测试 C# 单元测试
  • 使用 dockertest 进行 Golang SQL 单元测试的基本设置
    问题内容 我正在使用 dockertest 执行 sql 单元测试。这只是到 *sqlx.db 的简单连接,但在连接到数据库时,它以某种方式生成错误 error: eof 。我无法识别...
    99+
    2024-02-06
  • 如何Spring Boot中使用MockMvc对象进行单元测试
    这期内容当中小编将会给大家带来有关如何Spring Boot中使用MockMvc对象进行单元测试,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Spring测试框架提供MockMvc对象,可以在不需要客户端...
    99+
    2023-05-31
    springboot mockmvc
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作