Integration_Unit test coding standard
Integration & Unit test coding standard
命名规则
好的命名规则,直接从命名就可以清楚的知道该测试方法测试的内容和目的,而不用额外的添加注释说明。对于MVC而言,测试Controller是重点。
Testing Controller
对于Controller的测试,命名方式总共分为三段:
Action_Return[_Condition]
- Action:Controller的Action
- Return:期望的返回结果
- Condition:在怎样的条件下
比如如下的Controller:
public class AdminUserController : Controller
{
public async Task<IActionResult> Details(string id)
单元测试方法命名如下:
[Fact]
public async Task Details_ReturnViewResult_WhenExitsUserId()
[Fact]
public async Task Details_ReturnNotFoundViewResult_WhenNotExitsUserId()
集成测试方法命名如下;
[Fact]
public async Task Details_ReturnDetailsPage_WhenExitsUserId()
[Fact]
public async Task Details_ReturnNotFound_WhenNotExitsUserId()
另外,对于需求:Admin账号登录之后,菜单额外显示Admin菜单,单元测试无法做到,必须要用集成测试:
[Fact]
public async Task Login_ReturnHomePageWithAdminMenu_WhenIsAdmin()
集成测试要比单元测试慢几个数量级,所以能用单元测试验证的地方,就不要用集成测试
单元测试可以帮助我们Review Controller的职责
典型的controllers职责:
- 验证 ModelState.IsValid
- 如果 ModelState 不合法,返回错误响应
- 取得持久化的业务实体
- 对业务实体采取行动
- 持久化存储业务实体
- 返回合适的 IActionResult
避免在controllers中添加不必要的职责,以及保证测试仅仅集中在controller的职责,测试controllers的逻辑,在合法和不合法的输入下的行为,而不是检测其他的方法是否正确,举个例子:
[HttpPost]
public async Task<IActionResult> Index(NewSessionModel model)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
await _sessionRepository.AddAsync(new BrainstormSession()
{
DateCreated = DateTimeOffset.Now,
Name = model.SessionName
});
return RedirectToAction("Index");
}
单元测试如下:
[Fact]
public async Task IndexPost_ReturnsBadRequest_WhenModelStateIsInvalid()
{
// Arrange
var mockRepo = new Mock<IBrainstormSessionRepository>();
mockRepo.Setup(repo => repo.ListAsync()).Returns(Task.FromResult(GetTestSessions()));
var controller = new HomeController(mockRepo.Object);
controller.ModelState.AddModelError("SessionName", "Required");
var newSession = new HomeController.NewSessionModel();
// Act
var result = await controller.Index(newSession);
// Assert
var badRequestResult = Assert.IsType<BadRequestObjectResult>(result);
Assert.IsType<SerializableError>(badRequestResult.Value);
}
注意上面的测试主动给controller的ModelState添加了Error,而不是等Controller的ModelState.IsValid方法来判断Model是否输入了SessionName,ModelState.IsValid是否可以正常工作是集成测试负责的内容,单元测试只要负责检测 !ModelState.IsValid 时,是否返回BadRequest!单元测试要做的是,覆盖到Controller的每一个Return!
一般公用方法的单元测试
对于一般公用方法的测试,命名方式总共分为三段:
Action_Return[_Condition]
- Action:方法名称
- Return:期望的返回结果
- Condition:在怎样的条件下
比如一个用来检测奇数偶数的类:
public class OddEvenNumberChecker
{
public bool IsOdd(int number);
public bool IsEven(int number);
}
单元测试如下:
public class OddEvenNumberCheckerTest
{
[Fact]
public void IsOdd_ReturnTrue_When1357();
[Fact]
public void IsOdd_ReturnFalse_When2468();
[Fact]
public void IsEven_ReturnFalse_When1357();
[Theory]
[InlineData(2)]
[InlineData(4)]
[InlineData(6)]
[InlineData(8)]
public void IsEven_ReturnTrue_When2468(int value);
}
Integration_Unit test coding standard的更多相关文章
- C Coding Standard
1 共同 Rule 1 编译的Warnings不能被忽略掉 Rule 2 在已有Code或者三方的code基础上的改动,同意使用原来的coding standard Rule 3 假设同意C和C++都 ...
- 16/7/8_PHP-书写规范 PHP Coding Standard
变量命名规范这里感觉 打算采用 匈牙利命名法+驼峰法命名,因为 PHP是弱类型语言,很多时间因为忽略了变量类型而导致犯一些低级错误.所以在前面加上类型名有助于更好的理解代码. 下载是转载 PHP书写规 ...
- C# Coding Conventions(译)
C# Coding Conventions C#编码规范 Naming Conventions 命名规范Layout Conventions 布局规范Commenting Conventions 注释 ...
- coding规约的网站, 从sonar中链接过去
一个coding规约的网站, 从sonar中链接过去的. 挺好. https://wiki.sei.cmu.edu/confluence/display/seccode/SEI+CERT+Coding ...
- Change - Why we need coding standards
Change - Why we need coding standards I have the idea of coding standards when I have to review my t ...
- Deep Learning-Based Video Coding: A Review and A Case Study
郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! 1.Abstract: 本文主要介绍的是2015年以来关于深度图像/视频编码的代表性工作,主要可以分为两类:深度编码方案以及基于传统编码方 ...
- C# Coding Conventions, Coding Standards & Best Practices
C# Coding Conventions, Coding Standards & Best Practices Cui, Chikun Overview Introduction This ...
- 个人作业-Week2
第一部分 调研, 评测 运行平台 win 8 软件版本:微软必应词典桌面版 3.5.2 BUG标题:必应背单词无法发音 BUG详细描述:如图,左边为必应词典该单词的搜索,可以发音,而右边必应背单词中 ...
- 谈谈PHP代码规范
[转] http://www.syyong.com/php/Talk-about-PHP-code-specification.html 我向往这样一个php世界,里面没有代码规范之争.你我都一样,都 ...
随机推荐
- Python数据分析【炼数成金15周完整课程】
点击了解更多Python课程>>> Python数据分析[炼数成金15周完整课程] 课程简介: Python是一种面向对象.直译式计算机程序设计语言.也是一种功能强大而完善的通用型语 ...
- Python3爬虫一之(urllib库)
urllib库是python3的内置HTTP请求库. ython2中urllib分为 urllib2.urllib两个库来发送请求,但是在python3中只有一个urllib库,方便了许多. urll ...
- STM32F407VET6之IAR之ewarm7.80.4工程建立(基于官方固件库1.6版本) 的工程文件目录
最后整理结构如下所示,├─cmsis│ startup_stm32f401xx.s│ startup_stm32f40xx.s│ startup_stm32f40_41xxx.s│ startup_s ...
- IIS发布网站Microsoft JET Database Engine 错误 '80004005'的解决办法,基于Access数据库
在网站发布后,访问网站会有80004005的错误提示. 项目环境 项目基于Access数据库,server2012,文件系统为NTFS格式. 错误信息 Microsoft JETDatabase En ...
- Linuxx学习-特殊文件与进程
具有 SUID/SGID 权限的指令执行状态 SUID 的权限其实与进程的相关性非常的大!为什么呢?先来看看 SUID 的程序是如何被一般用户 执行,且具有什么特色呢? SUID 权限仅对二进制程序( ...
- UVa 11149 Power of Matrix 矩阵快速幂
题意: 给出一个\(n \times n\)的矩阵\(A\),求\(A+A^2+A^3+ \cdots + A^k\). 分析: 这题是有\(k=0\)的情况,我们一开始先特判一下,直接输出单位矩阵\ ...
- UVa 12299 线段树 单点更新 RMQ with Shifts
因为shift操作中的数不多,所以直接用单点更新模拟一下就好了. 太久不写线段树,手好生啊,不是这错一下就是那错一下. PS:输入写的我有点蛋疼,不知道谁有没有更好的写法. #include < ...
- python + selenium - selenium常用元素定位
1. Chrome定位工具 打开Chrome浏览器,按F12会弹出开发者工具选项,选择Elements: 1)鼠标点击最左边箭头 2)鼠标滑动到页面中你要操作的元素,单击一下 3)对应的html元素内 ...
- 精通CSS高级Web标准解决方案(2-2 可视化格式模型之定位概述)
视觉格式化模型 块级元素(块框).行内元素(行内框),可以使用display改变生成的框的类型,display:block让行内元素(比如<a>)表现的跟块级元素一样,display:no ...
- iOS--app自定义相册--给图片重写exif数据-定义相册时间戳
1.Exif简介 可交换图像文件格式常被简称为Exif(Exchangeable image file format),是专门为数码相机的照片设定的,可以记录数码照片的属性信息和拍摄数据. Exif可 ...