惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Simon Willison's Weblog
Simon Willison's Weblog
Help Net Security
Help Net Security
P
Privacy International News Feed
T
Threat Research - Cisco Blogs
C
Cisco Blogs
C
CERT Recently Published Vulnerability Notes
NISL@THU
NISL@THU
L
LINUX DO - 热门话题
Security Latest
Security Latest
A
Arctic Wolf
G
GRAHAM CLULEY
月光博客
月光博客
S
Securelist
D
Docker
J
Java Code Geeks
T
Troy Hunt's Blog
T
Tenable Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
SecWiki News
SecWiki News
S
Security @ Cisco Blogs
量子位
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
L
LINUX DO - 最新话题
Recent Commits to openclaw:main
Recent Commits to openclaw:main
aimingoo的专栏
aimingoo的专栏
博客园 - 【当耐特】
H
Heimdal Security Blog
The Hacker News
The Hacker News
博客园 - 三生石上(FineUI控件)
Application and Cybersecurity Blog
Application and Cybersecurity Blog
N
Netflix TechBlog - Medium
Vercel News
Vercel News
Forbes - Security
Forbes - Security
B
Blog RSS Feed
H
Hackread – Cybersecurity News, Data Breaches, AI and More
IT之家
IT之家
B
Blog
MongoDB | Blog
MongoDB | Blog
博客园 - 聂微东
Google DeepMind News
Google DeepMind News
S
Secure Thoughts
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
C
Check Point Blog
云风的 BLOG
云风的 BLOG
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
T
The Blog of Author Tim Ferriss
L
Lohrmann on Cybersecurity
F
Full Disclosure
D
Darknet – Hacking Tools, Hacker News & Cyber Security
P
Proofpoint News Feed

博客园 - 快乐就好

vs code使用 mvn install 使用winsw部署spring boot项目 springboot jrebel热部署 springboot devtools热启动 IntelliJ IDEA live template 方法配置 使用MHA实现MySQL主从复制高可用 Linux 常用命令介绍 开源堡垒机 dubbo循序渐进 - Jenkins自动化部署 maven教程 Git命令速查表 maven下载,上传设置 Maven中 jar包冲突原理与解决办法 延迟调度总结 使用Nexus3搭建Maven私服+上传第三方jar包到本地maven仓库 dubbo循序渐进 - 使用Docker安装Nexus dubbo循序渐进 - nacos安装 dubbo循序渐进 - 什么是RPC
浅谈单元测试
快乐就好 · 2020-09-30 · via 博客园 - 快乐就好
  1. 单元测试场景
    1. 单元测试粒度
    2. 外部依赖
      1. 单元测试中是不允许有任何外部依赖的,也就是说这些外部依赖都需要被模拟(mock)。外部依赖越多,mock越复杂。如何用模拟的依赖来测试真实依赖的行为?mock写的太简单,达不到测试的目的。mock太复杂, 不仅成本增加,而且又如何确保mock的正确性呢?
      2. 有的时候模拟是有效的方便的。但是其他一些时候,过多的模拟对象,Stub对象,假对象,导致单元测试主要在测模拟对象而不是实际的系统。
      3. Costs and Benefits
      4. 在受益于单元测试的好处的同时,也必然增加了代码量以及维护成本(单元测试代码也是要维护的)。下面这张成本/价值象限图很清晰的阐述了在不同性质的系统中单元测试__成本__和__价值__之间的关系。
    3. 1.依赖很少的简单的代码(左下)

      对于外部依赖少,代码又简单的代码。自然其成本和价值都是比较低的。举Go官方库里errors包为例,整个包就两个方法New()和Error(),没有任何外部依赖,代码也很简单,所以其单元测试起来也是相当方便。

      2. 依赖较多但是很简单的代码(右下)

      依赖一多,mock和stub就必然增多,单元测试的成本也就随之增加。但代码又如此简单(比如上述errors包的例子),这个时候写单元测试的成本已经大于其价值,还不如不写单元测试。

      3. 依赖很少的复杂代码 (左上)

      像这一类代码,是最有价值写单元测试的。比如一些独立的复杂算法(银行利息计算,保险费率计算,TCP协议解析等),像这一类代码外部依赖很少,但却很容易出错,如果没有单元测试,几乎不能保证代码质量。

      4.依赖很多又很复杂(右上)

      这种代码显然是单元测试的噩梦。写单元测试吧,代价高昂;不写单元测试吧,风险太高。像这种代码我们尽量在设计上将其分为两部分:1.处理复杂的逻辑部分 2.处理依赖部分

    4. 我们遇到最常见的依赖无非下面几种:

      1. 网络依赖——函数执行依赖于网络请求,比如第三方http-api,rpc服务,消息队列等等
      2. 数据库依赖
      3. I/O依赖(文件)
      4. 未开发完成的功能模块
    5. 处理方式:抽象成接口,通过mock和stub进行模拟测试
    6. 开始敲产品代码的时候,我们必然已经过初步的设计,已经了解系统中的外部依赖以及业务复杂的部分,这些部分是要优先考虑写单元测试的
  2. 单元测试的工具
    1. Mockito
      1. Mockito是一个针对Java的mocking框架。它与EasyMock和jMock很相似,但是通过在执行后校验什么已经被调用,它消除了对期望行为(expectations)的需要。其它的mocking库需要你在执行前记录期望行为(expectations),而这导致了丑陋的初始化代码。
  3. 案例分析