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的更多相关文章

  1. C Coding Standard

    1 共同 Rule 1 编译的Warnings不能被忽略掉 Rule 2 在已有Code或者三方的code基础上的改动,同意使用原来的coding standard Rule 3 假设同意C和C++都 ...

  2. 16/7/8_PHP-书写规范 PHP Coding Standard

    变量命名规范这里感觉 打算采用 匈牙利命名法+驼峰法命名,因为 PHP是弱类型语言,很多时间因为忽略了变量类型而导致犯一些低级错误.所以在前面加上类型名有助于更好的理解代码. 下载是转载 PHP书写规 ...

  3. C# Coding Conventions(译)

    C# Coding Conventions C#编码规范 Naming Conventions 命名规范Layout Conventions 布局规范Commenting Conventions 注释 ...

  4. coding规约的网站, 从sonar中链接过去

    一个coding规约的网站, 从sonar中链接过去的. 挺好. https://wiki.sei.cmu.edu/confluence/display/seccode/SEI+CERT+Coding ...

  5. 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 ...

  6. Deep Learning-Based Video Coding: A Review and A Case Study

    郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! 1.Abstract: 本文主要介绍的是2015年以来关于深度图像/视频编码的代表性工作,主要可以分为两类:深度编码方案以及基于传统编码方 ...

  7. C# Coding Conventions, Coding Standards & Best Practices

    C# Coding Conventions, Coding Standards & Best Practices Cui, Chikun Overview Introduction This ...

  8. 个人作业-Week2

    第一部分  调研, 评测 运行平台 win 8 软件版本:微软必应词典桌面版 3.5.2 BUG标题:必应背单词无法发音 BUG详细描述:如图,左边为必应词典该单词的搜索,可以发音,而右边必应背单词中 ...

  9. 谈谈PHP代码规范

    [转] http://www.syyong.com/php/Talk-about-PHP-code-specification.html 我向往这样一个php世界,里面没有代码规范之争.你我都一样,都 ...

随机推荐

  1. python-numpy-pandas

    目录 numpy 模块 创建矩阵方法: 获取矩阵的行列数 切割矩阵 矩阵元素替换 矩阵的合并 通过函数创建矩阵 矩阵的运算 pandas模块 series (一维列表) DataFrame DataF ...

  2. Kubernetes(k8s)底层网络原理刨析

    目录 1 典型的数据传输流程图 2 3种ip说明 3 Docker0网桥和flannel网络方案 4 Service和DNS 4.1 service 4.2 DNS 5 外部访问集群 5.1 外部访问 ...

  3. bash实例

    1写一个脚本,完成如下功能(使用函数):1.脚本使用格式:mkscript.sh [-D|--description "script description"] [-A|--aut ...

  4. Alpha版(内部测试版)发布

    首先通过微信扫吗下载我们的软件校园服务,首先进去登录界面没账号点击注册,注册完就可以登录了,进去界面我们在二手交易这项功能里我们即可以事卖家又可以是买家如果我们卖东西点击商品出售,填写商品信息,商品图 ...

  5. noip2017行记

    前奏 写了所有的变量名在linux下测,结果发现并没什么用...听说将所有的变量加上下划线,加上自己的名字作为前缀.. lgj,“感觉今年有网络流,今年要立个flag”,zjr“你咋不上天儿” 在车上 ...

  6. Python之code对象与pyc文件(一)

    Python程序的执行过程 我们都知道,C语言在执行之前需要将源代码编译成可执行的二进制文件,也就是将源代码翻译成机器代码,这种二进制文件一旦生成,即可用于执行.但是,Python是否一样呢?或许很多 ...

  7. PYday15--面向对象的进阶:集成、成员、方法、异常处理

    1.继承 实例: 2.构造方法: 3.反射:以字符串的形式去模块操作其成员. 成员: 最外层是文件,文件里面包含类,通过类可以创建对象,对象可以封装字段和指针.类里面可以有方法,指针可以指向方法. 通 ...

  8. Selenium WebDriver-操作单选框

    先判断按钮是否已经被选中 如果没有被选中,才可以点击 #encoding=utf-8 import unittest import time import chardet from selenium ...

  9. Django底层原理简介与安装

    Django环境目录搭建一栏: 利用wsgiref模块封装好的socket搭建服务端: #利用wsgiref模块封装好的socket演示操作(例如accept\recv) #也可以实现socket服务 ...

  10. [uiautomator篇][exist 存在,但click错误]

    uiautomator定位页面元素是,定位存在的;但是click的时候,发现点的位置不对,(不知道是android系统的问题还是uiautomator的问题,初步怀疑是系统的问题)