C#单元测试

xUnit + Moq + coverlet.collector

1.添加库

MlyMathLib

2.编写库函数内容

using System;namespace MlyMathLib
{public interface IUserRepo{string GetName(int id);}public class UserService{private readonly IUserRepo _repo;public UserService(IUserRepo repo) => _repo = repo;public string Greet(int id) => $"Hello, {_repo.GetName(id)}!";}
}

3.添加单元测试

项目模板选择 xUnit测试项目
MlyMathLibTests
注意检查coverlet.collector 和Moq的库引用

4.编写测试用例

using MlyMathLib;
using Moq;namespace MlyMathLibTests
{public class UserServiceTests{private readonly Mock<IUserRepo> _repoMock = new();private readonly UserService _sut;public UserServiceTests(){_sut = new UserService(_repoMock.Object);}#region Greet[Fact]public void Greet_IdExists_ReturnsExpectedGreeting(){// Arrange_repoMock.Setup(r => r.GetName(1)).Returns("Alice");// Actvar actual = _sut.Greet(1);// AssertAssert.Equal("Hello, Alice!", actual);_repoMock.Verify(r => r.GetName(1), Times.Once);}[Theory][InlineData(0, "")][InlineData(-1, "Bob")][InlineData(int.MaxValue, "Z")]public void Greet_VariousValidIds_ReturnsCorrectGreeting(int id, string name){// Arrange_repoMock.Setup(r => r.GetName(id)).Returns(name);// Act & AssertAssert.Equal($"Hello, {name}!", _sut.Greet(id));}[Fact]public void Greet_RepoReturnsNull_ReturnsHelloNull(){// Arrange_repoMock.Setup(r => r.GetName(42)).Returns((string?)null);// Actvar actual = _sut.Greet(42);// AssertAssert.Equal("Hello, !", actual); // 实际输出:Hello, !}#endregion}
}

5.运行项目

如果没报错,终端会出现控制台和输出内容

6.生成报告(覆盖率)

打开终端
依次运行命令
注意:路径和反斜杠问题

# 1. 运行测试并收集覆盖率(生成 cobertura 格式的 xml)
dotnet test --collect:"XPlat Code Coverage" --results-directory ./TestResults# 2. 安装 ReportGenerator(全局只需一次)
dotnet tool install -g dotnet-reportgenerator-globaltool# 3. 把 xml 转成漂亮的 HTML
reportgenerator \-reports:"TestResults/*/coverage.cobertura.xml" \-targetdir:"coverage-html" \-reporttypes:"Html;Cobertura" \-title:"DemoLib 单元测试报告"# 4. 打开报告(Windows 用 start,macOS 用 open,Linux 用 xdg-open)
start coverage-html/index.html        # Windows
# open coverage-html/index.html       # macOS
# xdg-open coverage-html/index.html   # Linux

实际命令

dotnet test --collect:"XPlat Code Coverage"
dotnet test --collect:"XPlat Code Coverage" --results-directory ./TestResults
dotnet tool install -g dotnet-reportgenerator-globaltoolreportgenerator -reports:"TestResults\60fe6df2-8246-45b8-81ef-cd4d267aa97c\coverage.cobertura.xml" -targetdir:"coverage-html" -reporttypes:"Html;Cobertura" -title:"DemoLib"

reportgenerator -reports:“TestResults\89f052dd-c413-470d-be24-832e2d53251e\coverage.cobertura.xml” -targetdir:“coverage-html” -reporttypes:“Html;Cobertura” -title:“Common.Logger.Tests”

7.生成报告(是否通过)

使用 dotnet test 生成测试报告
运行以下命令,生成测试报告:

dotnet test --logger "trx;LogFileName=test-results.trx"

这会在当前目录下生成一个 test-results.trx 文件,该文件是一个 XML 格式的测试报告,包含了每个测试的通过/失败情况。

extentreports-dotnet-cli

Trxer

Usage
Trxer is an EXE file.
Trxer.exe <file.trx>
The output will be at the trx folder under the name “file.trx.html”

TrxerConsole.exe <TRX file>

下载项目 重新编译
https://github.com/NivNavick/trxer

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

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

相关文章

【数据库】Oracle学习笔记整理之五:ORACLE体系结构 - 参数文件与控制文件(Parameter Files Control Files)

Oracle体系结构 - 参数文件与控制文件&#xff08;Parameter Files & Control Files&#xff09; 参数文件与控制文件是Oracle数据库的“双核基石”&#xff1a;参数文件是实例的“启动配置中心”&#xff0c;定义运行环境与规则&#xff1b;控制文件是数据库的“物理元数据…

GDB典型开发场景深度解析

GDB典型开发场景深度解析 以下是开发过程中最常见的GDB使用场景&#xff0c;结合具体实例和调试技巧&#xff0c;帮助开发者高效解决实际问题&#xff1a;一、崩溃分析&#xff08;Core Dump调试&#xff09; 场景&#xff1a;程序突然崩溃&#xff0c;生成了core文件 # 启动调…

存储、硬盘、文件系统、 IO相关常识总结

目录 &#xff08;一&#xff09;存储 &#xff08;1&#xff09;定义 &#xff08;2&#xff09;分类 &#xff08;二&#xff09;硬盘 &#xff08;1&#xff09;容量&#xff08;最主要的参数&#xff09; &#xff08;2&#xff09;转速 &#xff08;3&#xff09;访…

docker安装mongodb及java连接实战

1.docker部署mongodb docker run --name mongodb -d -p 27017:27017 -v /data/mongodbdata:/data/db -e MONGO_INITDB_ROOT_USERNAMEtestmongo -e MONGO_INITDB_ROOT_PASSWORDtest123456 mongodb:4.0.112.项目实战 <dependencies><dependency><groupId>org.m…

Java设计模式之《工厂模式》

目录 1、介绍 1.1、定义 1.2、优缺点 1.3、使用场景 2、实现 2.1、简单工厂模式 2.2、工厂方法模式 2.3、抽象工厂模式 3、小结 前言 在面向对象编程中&#xff0c;创建对象实例最常用的方式就是通过 new 操作符构造一个对象实例&#xff0c;但在某些情况下&#xff0…

【异步】js中异步的实现方式 async await /Promise / Generator

JS的异步相关知识 js里面一共有以下异步的解决方案 传统的回调 省略 。。。。 生成器 Generator 函数是 ES6 提供的一种异步编程解决方案, 语法上&#xff0c;首先可以把它理解成&#xff0c;Generator 函数是一个状态机&#xff0c;封装了多个内部状态。执行 Generator 函数…

JVM字节码文件结构

Class文件结构class文件是二进制文件&#xff0c;这里要介绍的是这个二级制文件的结构。思考&#xff1a;一个java文件编译成class文件&#xff0c;如果要描述一个java文件&#xff0c;需要哪些信息呢&#xff1f;基本信息&#xff1a;类名、父类、实现哪些接口、方法个数、每个…

11.web api 2

5. 操作元素属性 5.1操作元素常用属性 &#xff1a;通过 JS 设置/修改标签元素属性&#xff0c;比如通过 src更换 图片最常见的属性比如&#xff1a; href、title、src 等5.2 操作元素样式属性 &#xff1a;通过 JS 设置/修改标签元素的样式属性。使用 className 有什么好处&a…

java中数组和list的区别是什么?

在Java中&#xff0c;数组&#xff08;Array&#xff09;和List&#xff08;通常指java.util.List接口的实现类&#xff0c;如ArrayList、LinkedList&#xff09;是两种常用的容器&#xff0c;但它们在设计、功能和使用场景上有显著区别。以下从核心特性、使用方式等方面详细对…

Python爬取推特(X)的各种数据

&#x1f31f; Hello&#xff0c;我是蒋星熠Jaxonic&#xff01; &#x1f308; 在浩瀚无垠的技术宇宙中&#xff0c;我是一名执着的星际旅人&#xff0c;用代码绘制探索的轨迹。 &#x1f680; 每一个算法都是我点燃的推进器&#xff0c;每一行代码都是我航行的星图。 &#x…

Oracle数据库文件管理与空间问题解决指南

在Oracle数据库运维中&#xff0c;表空间、数据文件及相关日志文件的管理是保障数据库稳定运行的核心环节。本文将系统梳理表空间与数据文件的调整、关键文件的移动、自动扩展配置&#xff0c;以及常见空间不足错误的排查解决方法&#xff0c;为数据库管理员提供全面参考。 一、…

华为实验综合小练习

描述&#xff1a; 1 内网有A、B、C 三个部门。所在网段如图所示。 2 内网服务器配置静态IP,网关192.168.100.1。 3 sw1和R1之间使用vlan200 192.168.200.0/30 互联。 4 R1向运营商申请企业宽带并申请了5个公网IP&#xff1a;200.1.1.1-.5子网掩码 255.255.255.248&#xff0c;网…

Flink面试题及详细答案100道(1-20)- 基础概念与架构

《前后端面试题》专栏集合了前后端各个知识模块的面试题&#xff0c;包括html&#xff0c;javascript&#xff0c;css&#xff0c;vue&#xff0c;react&#xff0c;java&#xff0c;Openlayers&#xff0c;leaflet&#xff0c;cesium&#xff0c;mapboxGL&#xff0c;threejs&…

爬虫逆向之滑块验证码加密分析(轨迹和坐标)

本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的。否则由此产生的一切后果均与作者无关&#xff01;在爬虫开发过程中&#xff0c;滑块验证码常常成为我们获取数据的一大阻碍。而滑块验证码的加密方式多种多样&#xff0c;其中轨迹加密和坐标加密是比较常见的…

微信小程序实现导航至目的地

本人做的导航页面相关功能和效果的代码 javascript相关 Page({data: {markers: [],latitude: , // 中心点坐标longitude: ,FIXED_LAT: 31.2304, // 1. 写死的目标点坐标, 示例&#xff1a;上海人民广场FIXED_LNG: 121.4737},onLoad: function () {// 如果要显示地图可以看onLo…

中国科学社简史

中国科学社简史中国科学社&#xff0c;作为中国近代史上第一个民间综合性科学团体&#xff0c;为中国现代科学文化事业的发展做出了卓越贡献。其历程不仅见证了中国科学从萌芽到蓬勃发展的转变&#xff0c;还反映了中国科学体制化的艰难探索与辉煌成就。中国科学社的起源可追溯…

若尔当型,Jordon Form

文章目录一、相似二、若尔当型1.1 认识若尔当型1.2 凯莱-哈密顿定理 (Cayley-Hamilton Theorem)一、相似 Every matrix CB−1ABC B^{-1}ABCB−1AB has the same eigenvalues as A. These C’s are similar to A. 任意一个矩阵C&#xff0c;满足 CB−1ABC B^{-1}ABCB−1AB 都和…

解决uni-app微信小程序编译报错:unexpected character `1`

问题原因在uni-app微信小程序开发中&#xff0c;当template模板中包含英文符号<或>时&#xff0c;微信小程序的编译器会将这些符号误认为是HTML标签的开闭符号&#xff0c;从而导致类似unexpected character 1的编译错误。错误示例<view class"plan-bmi">…

[Linux] RAID存储技术

目录 RAID实现方式 RAID 0 RAID 1 RAID 5 RAID 10 管理RAID0 创建RAID 查看RAID 格式化和挂载 删除RAID 管理RAID1 创建RAID 查看RAID 格式化和挂载 增加热备盘 模拟故障 删除故障磁盘 删除RAID 管理RAID5 创建RAID 查看RAID md5设备划分分区 RAID实现方…

程序设计|C语言教学——C语言基础4:进阶

一、预处理指令预处理指令在编译前执行&#xff0c;除了#include&#xff0c;还有以下常用指令&#xff1a;1. #define 宏定义无参宏&#xff1a;定义常量或代码片段&#xff0c;编译时直接替换&#xff08;无类型检查&#xff09;。#define PI 3.1415926 // 定义常量 #define…