浅谈.Net Core后端单位测试的实现

单位测试一直都是"长处各人都知道许多,可是因为各种原因没有实施起来"的一个老浩劫问题。详细是否应该落地单位测试,以及落地的水平, 每个项目都有本身的环境。

本篇为小我私家认为"如何更好地写单位测试", 即越发 方向实践向 中混合一些理论的分享。

下列示例的单位测试框架为 xUnit , Mock库为 Moq

2. 为什么需要单位测试

利益有许多, 这里提两点我小我私家认为的很明明的长处

2.1 防备回归

凡是在举办新成果/模块的开拓可能是重构的时候,测试会举办回归测试原有的已存在的成果,以验证以前实现的成果是否仍能按预期运行。

利用单位测试,可在每次生成后,甚至在变动一行代码后从头运行整套测试, 从而可以很洪流平淘汰回归缺陷。

2.2 淘汰代码耦合

今世码细密耦合可能一个要领过长的时候,编写单位测试会变得很坚苦。当不去做单位测试的时候,大概代码的耦合不会给人感受那么明明。为代码编写测试会自然地解耦代码,变相提高代码质量和可维护性。

3. 根基原则和类型  3.1 3A原则

3A别离是"arrange、act、assert", 别离代表一个及格的单位测试要领的三个阶段

事先的筹备

测试要领的实际挪用

针对返回值的断言

一个单位测试要领可读性是编写测试时最重要的方面之一。 在测试中疏散这些操纵会明晰地突出显示挪用代码所需的依赖项、挪用代码的方法以及实验断言的内容.

所以在举办单位测试的编写的时候, 请利用注释标志出3A的各个阶段的, 如下示例

[Fact] public async Task VisitDataCompressExport_ShouldReturnEmptyResult_WhenFileTokenDoesNotExist() { // arrange var mockFiletokenStore = new Mock<IFileTokenStore>(); mockFiletokenStore .Setup(it => it.Get(It.IsAny<string>())) .Returns(string.Empty); var controller = new StatController( mockFiletokenStore.Object, null); // act var actual = await controller.VisitDataCompressExport("faketoken"); // assert Assert.IsType<EmptyResult>(actual); }

3.2 只管制止直接测试私有要领

尽量私有要领可以通过反射举办直接测试,可是在大大都环境下,不需要直接测试私有的private要领, 而是通过测试民众public要领来验证私有的private要领。

可以这样认为:private要领永远不会孤独存在。更应该体贴的是挪用private要领的public要领的最终功效。

3.3 重构原则

假如一个类/要领,有许多的外部依赖,造成单位测试的编写坚苦。那么应该思量当前的设计和依赖项是否公道。是否有部门可以存在解耦的大概性。选择性重构原有的要领,而不是硬着头皮写下去.

3.4 制止多个断言

假如一个测试要领存在多个断言,大概会呈现某一个或几个断言失败导致整个要领失败。这样不能从基础上知道是相识测试失败的原因。

所以一般有两种办理方案

拆分成多个测试要领

利用参数化测试, 如下示例

[Theory] [InlineData(null)] [InlineData("a")] public void Add_InputNullOrAlphabetic_ThrowsArgumentException(string input) { // arrange var stringCalculator = new StringCalculator(); // act Action actual = () => stringCalculator.Add(input); // assert Assert.Throws<ArgumentException>(actual); }

虽然假如是对工具举办断言, 大概会对工具的多个属性都有断言。此为破例。

3.5 文件和要领定名类型 文件名类型

一般有两种。好比针对 UserController 下要领的单位测试应该统一放在 UserControllerTest 可能 UserController_Test 下

单位测试要领名

单位测试的要领名应该具有可读性,让整个测试要领在不需要注释说明的环境下可以被读懂。名目应该雷同遵守如下

<被测试要领全名>_<期望的功效>_<给以的条件> // 例子 [Fact] public void Add_InputNullOrAlphabetic_ThrowsArgumentException() { ... }

4. 常用类库先容 4.1 xUnit/MsTest/NUnit

编写.Net Core的单位测试绕不外要选择一个单位测试的框架, 三大单位测试框架中

MsTest是微软官方出品的一个测试框架

NUnit没用过

xUnit是.Net Foundation下的一个开源项目,而且被dotnet github上许多客栈(包罗runtime)利用的单位测试框架

三大测试框架成长至今已是大差不差, 许多时候选择只是靠小我私家的爱好。

小我私家偏好 xUnit 简捷的断言

// xUnit Assert.True() Assert.Equal() // MsTest Assert.IsTrue() Assert.AreEqual()

客观地成果性地阐明三大框架地差别可以参考如下

https://anarsolutions.com/automated-unit-testing-tools-comparison

4.2 Moq

官方客栈

https://github.com/moq/moq4

Moq是一个很是风行的模仿库, 只要有一个接口它就可以动态生成一个工具, 底层利用的是Castle的动态署理成果.

根基用法

在实际利用中大概会有如下场景

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsjjpp.html