UnitTest in .NET 系列文章目录


Photo :.NET单元测试的艺术

文 | Edison Zhou

这几天陆陆续续更新了UnitTest in .NET这个系列的文章,现将其总结成一个小目录。此外,特别推荐阅读Roy Osherove的《单元测试的艺术》一书,此文也是该书的精华内容的学习笔记总结。

文章目录 

Part 1.基本概念及第一个单元测试

Part 2.使用存根破除依赖

Part 3.使用模拟对象进行交互测试

Part 4.使用模拟框架简化测试代码

Part 5.高效管理与组织单元测试

一些补充 

此系列主要使用的是NUnit + NSub来介绍的,但你也可以用MSTest 或者 xUnit 来实现,模拟框架的话你也可以用同样流行的Moq来做。但是,此类模拟框架都是以模拟接口为目标来设计的,无法模拟静态方法等高级对象,如果你所维护或开发的项目是一个遗留系统,即所谓很多的遗留代码(Legacy Code)的系统,那么建议最好使用一些比较高级的模拟框架,比如JustMock(付费版),它可以模拟静态方法、密封类、私有成员、MsCorLib程序集的成员(比如DateTime.Now)甚至是Silverlight项目代码。

有关JustMock框架的介绍,请移步这里:https://www.telerik.com/products/mocking.aspx

此外,我也强烈建议大家结合Jenkins等CI工具把单元测试引入持续集成的构建之中,这样可以最大限度的发挥单元测试在开发测试过程中的作用。

在Jenkins中提供了Pipeline方便地进行构建流水线,在我的实践中主要是通过开发人员的每一次Check-In到git,触发一个Webhook到Jenkins中从而使持续集成构建任务开始执行:

从图中可以看出,其经历了中台微服务的编译和单元测试 及 BFF(Backend for Frontend)服务的编译和单元测试来保障代码质量,当然前提是有足够的单元测试作为保护层,这也需要开发人员花时间为每个服务接口(或者高价值的部分)写单元测试!

如果构建任务中有一个Stage失败了,那么此构建任务则认为失败,会给开发团队和Leader发送邮件告警:

此外,我们还使用了一个用于大屏显示构建状态的插件—Build Monitor,在我们工作区后方的电视屏上会显示各个构建任务的实时状态,如果有任务失败了会变为红色:

并且,Build Monitor还会将推进不可靠代码的提交者名字(git账号名字)显示在屏幕中的构建任务里边,方便大家查看谁的锅:

参考资料  

Roy Osherove 著,金迎 译,《单元测试的艺术(第2版)》

Edison Zhou,《基于Jenkins的开发测试全流程持续集成实践》

Edison Zhou,《基于Jenkins Pipeline的ASP.NET Core持续集成实践》

The End

「 码字不易,也希望各位看官看完觉得还行就在本文右下方顺手点个“在看”,那就是对我最大的鼓励!如果觉得很好,也可以转发给你的朋友,让更多人看到,独乐乐不如众乐乐,是吧?

往期精彩回顾

.NET Core on K8S学习与实践系列文章索引目录

.NET Core 微服务学习与实践系列文章索引目录

【资料】2019 .NET China Conf 大会资料下载

【视频】2019 .NET China Conf 大会视频发布

2019 .NET China Conf 路一直都在,社区会更好

基于Jenkins的开发测试全流程持续集成实践

基于Jenkins Pipeline的.NET Core持续集成实践

【导读】我读经典,心旷神怡 - 经典书籍读后感汇总

【导读】我的诗和远方 - 也读唐诗与旅游游记汇总


点个【在看】如何?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/312293.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++多继承语法

C允许一个类继承多个类 多继承可能会引发父类中有同名成员出现&#xff0c;需要加作用域区分 C实际开发中不建议用多继承 语法&#xff1a;class 子类 : 继承方式 父类1 , 继承方式 父类2 … 代码如下&#xff1a; #include <iostream> using namespace std;//父类 …

java蝇量模式_Head First设计模式——蝇量和解释器模式

蝇量蝇量模式&#xff1a;如果让某个类的一个实例能用来提供许多“虚拟实例”&#xff0c;就使用蝇量模式。在一个设计房子的平台中&#xff0c;周围要加上一些树&#xff0c;树有一个坐标XY坐标位置&#xff0c;而且可以根据树的年龄动态将自己绘制出来。如果我们创建许多树之…

如何运用领域驱动设计 - 聚合

概述DDD实战与进阶 - 值对象如何运用DDD - 实体如何运用领域驱动设计 - 领域服务在前几篇的博文中&#xff0c;我们已经学习到了如何运用实体和值对象。随着我们所在领域的不断深入&#xff0c;领域模型变得逐渐清晰&#xff0c;我们已经建立了足够丰富的实体和值对象。但随着实…

C++菱形继承

菱形继承概念&#xff1a; 1.两个派生类继承同一个基类 2.又有某个类同时继承着两个派生类 这种继承被称为菱形继承&#xff0c;或者钻石继承 举个例子&#xff1a; 菱形继承问题&#xff1a; 1.羊继承了动物的数据&#xff0c;鸵同样继承了动物的数据&#xff0c;当羊驼使…

ASP.NET Core Web程序托管到Windows 服务

前言在 .NET Core 3.1和WorkerServices构建Windows服务 我们也看到了,如何将workerservices构建成服务,那么本篇文章我们再来看看如何将web应用程序托管到我们的服务中.将WEB应用作为服务运行我们需要将我们的WEB应用程序编译成exe文件&#xff0c;在ASP.NETCore中其实这是一个…

运行wordcount.java_运行hadoop wordcount程序

我正在通过以下michael-noll教程学习hadoop . 当我试图通过运行 hadoop jar hadoop-examples-1.2.1.jar wordcount tmp/Files tmp/Output 运行wordcount示例时&#xff0c;我收到以下错误&#xff1a;13/11/10 18:09:42 INFO ipc.Client&#xff1a;重试连接到服务器&#xff1…

EntityFramework Core动态加载模型,我们要知道些什么呢?

这篇文章源于一位问我的童鞋&#xff1a;在EntityFramework Core中如何动态加载模型呢&#xff1f;在学习EntityFramwork时关于这个问题已有对应童鞋给出答案&#xff0c;故没有过多研究&#xff0c;虽然最后解决了这位童鞋提出的问题&#xff0c;但是当我再次深入研究时&#…

C++多态的基本语法与原理剖析

多态分为两类 1.静态多态&#xff1a;函数重载和运算符重载属于静态多态&#xff0c;复用函数名 2.动态多态&#xff1a;派生类和虚函数实现运行时多态 静态多态和动态多态区别&#xff1a; 1.静态多态的函数地址早绑定&#xff0c;编译阶段确定函数地址 2.多态多态的函数地址…

从零开始开发 VS Code 插件之 Translator Helper

本文目录Translator Helper 介绍开发概述创建第一个VS Code Extension需求分析操作文本调用Google Translation API实现核心功能配置命令插件配置测试插件打包插件发布插件CI/CDIcon及README小结Translator Helper 介绍 微软 Docs 网站上线之后&#xff0c;我发现很多中文内容是…

java printf 版本_java – PrintStream类型中的printf(String,Object ...

为什么通过简单调用printf会出现以下编译错误&#xff1f;我的代码&#xff1a;import java.util.Scanner;public class TestCodeBankAccInputs{public static void main(String[] args){String displayName "Bank of America Checking";int balance 100;System.ou…

C++string容器-构造函数

本质&#xff1a; string是C风格的字符串&#xff0c;而string本质上是一个类 string和char区别&#xff1a; 1.char是一个指针 2.string是一个类&#xff0c;类内部封装了char*&#xff0c;管理这个字符串&#xff0c;是一个char*型的容器 string构造函数原型&#xff1a; 1…

【实战 Ids4】║ 又一个项目迁移完成(MVC)

迎周一&#xff0c;腊月十九&#xff0c;小年倒计时新年还有两周时间就要到了&#xff0c;学习可不能停&#xff0c;这几天一直在加班调休&#xff0c;周末也如此&#xff0c;不过也是趁着半夜凌晨的时间&#xff0c;继续迁移我的项目到IdentityServer4统一认证授权中心Blog.Id…

C++string容器-赋值操作

功能描述&#xff1a; 给string字符串进行赋值 代码如下&#xff1a; #include <iostream> using namespace std; #include <cstring>void test01() {string str1;str1 "hello world";cout << "str1 " << str1 << endl;…

C++生成随机数

C中生成随机数常用这两个函数&#xff1a; rand()和srand() rand()函数&#xff0c;生成一个范围在[0,RAND_MAX]的随机数&#xff0c;RAND_MAX的值为32767 其中RAND_MAX定义在cstdlib头文件中。 #include <iostream> using namespace std; #include <cstdlib>in…

JAVA解决生产消费者_Java常用三种方式解决生产者消费者问题(详细)

package test;/*** Synchronized 版本解决生产者消费者* wait() / notify()方法*/import java.util.LinkedList;import java.util.Queue;public class ProducerAndConsumerForSynchronized {// 1. 先定义最大生产长度private final int MAX_SIZE 10;// 2.定义储存队列private …

为什么说云原生会成为未来企业技术变迁的趋势

云原生是当下的热点话题&#xff0c;但是很多人对云原生有很多误解&#xff0c;特别是传统产业物联网或工控、物联网行业对云原生显得"后知后觉"。与其在这里说是预测&#xff0c;不如说是现在进行时&#xff0c;只是由于传统产业本身的技术包袱和组织个人认识程度差…

C++vector容器-构造函数

vector数据结构和数组非常相似&#xff0c;也称为单端数组&#xff0c;在数组的尾段可以做插入&#xff0c;删除操作 vector不同于普通数组&#xff0c;vector可以动态扩展 动态扩展&#xff1a;并不是在原空间之后续接新空间&#xff0c;而是找更大的内存空间&#xff0c;然…

java对象类型转换分为_java-如何将类对象转换为通用对象类型?

我正在研究一种使用NamedParameterJdbcTemplate从MySQL数据库获取一些数据的方法. listCurrentRecords应该从数据库返回Customer,Product和SalesOrder的对象类型列表. objectType是从在方法(1 || 2 || 3)内传递的参数定义的,并且在类中更早地定义为public变量.public static fi…

BeetleX网关之请求聚合

在网关服务中请求聚合是允许把多个请求打包成一个响应给请求方&#xff0c;这样不仅可以节省请求方的请求数量&#xff0c;还可以根据需求的情况整合不同业务数据响应请求。BeetleX.Bumblebee虽然并没有内置这一功能&#xff0c;但可以通过扩展的形式来支持请求聚合&#xff0c…

C++vector容器-赋值操作

vector赋值操作 功能描述&#xff1a; 给vector容器进行赋值 函数原型&#xff1a; 代码如下&#xff1a; #include <iostream> using namespace std; #include <vector> //vector赋值操作void printVector(vector<int> &v) {for (vector<int >…