伴随着程序成长,测试变长,复杂性增加,如何更高效的写测试,对以后开发不会造成麻烦。

测试本身没发被测试,所以一定要清楚,可控。不要加循环,不要过于复杂的自动编程。

Cost and Value 成本和价值。

测试有成本和价值 。因此要最小化成本,最大化价值。

什么是成本,什么是价值?

成本(time):

  • 写测试的时间
  • 每次运行测试花费的时间
  • 理解测试所需要的时间
  • 如果测试出错,搞定它并让程序ok的时间
  • 有时候,改变程序代码带来的调整测试所花费的时间
价值(部分)
  • 写测试的行为让它更容易的定义代码的结构
  • 在集成测试步骤,运行自动化测试快于手动测试
  • 测试可以提供有效证据:代码工作正常。
  • 如果代码变化了,测试就可以看出来,测试提供了⚠️机制。
  • 测试可以帮助开发者更容易的定位bugs
如何写测试节约时间:
  • 思考如何让测试失败,而不是成功。如果测试没办法失败,可能不需要这个测试
  • 集成测试,integration!留出时间做集成测试
  • 对于单元测试,写单元测试关联小的代码变化。使用Mocks and Stubs.
  • 尽量避免使用高成本行为,如使用额外的代码库,和数据库的大量对象。在测试中,一个好办法是使用test doubles ,可以避免单元测试用真实的数据依赖。
  • 如果发现发一个单一bug让许多测试失败,考虑是否那些测试是有用。如果失败是计划的,考虑失败的那些测试是否在计划中。
  • 有时候在开发中有用的测试被之后的测试取代。这些测试可以被删除,或skip,注释。
  • 如果要花费好多步骤来写一个单元测试,思考这种可能性:测试在试图告诉你,代码的设计可以被改进以减小依赖性。
Prescription:当写测试时,考虑短期和长期的测试成本。

SWIFT: The Five Qualities of Valuable Tests

  • Straightforward
  • Well defined
  • Independent
  • Fast
  • Truthful

 Straightforward

测试的命名直观-重要。 一目了然的本地创建的数据也有帮助。Factory_Bot有效帮助预备件。

长测试或步骤应当分类。

测试的“”描述,清晰让自己以后debug的时候可以轻松理解。

不要用loop,如果必须检验,可以抽几个重要的hash对儿,统一放在一个it中。

Well Defined 

如果反复运行相同的测试得出统一的结果,这个测试则被定义的很好。

三个典型的重复问题是:

  • time and date testing
  • random numbers
  • third-party or Ajax calls

关键的解决办法是:让测试数据可复制的,一致的。使用封装和test doubles。

第14章讨论测试第三方服务, 7章讨论test doubles

Independent

如果不依靠其他测试或额外数据,一个测试就是独立的。这样可以限定测试失败的范围。易于dubug。

影响独立性的最大障碍是使用全局数据。

第15章讲解Troubleshooing 和debug

Fast 

长测试会延长测试速度,作者见过30分钟的测试。

让测试变慢的几个重要原因:

  • 开始时间?
  • 代码中的依赖,在测试中需要创建大量对象来使用方法。
  • 过度的使用数据库或者额外的第三方服务
加速的办法是隔绝Rails stack的应用逻辑。可以不加载整个raisl来提速。或者不从数据库检索数据。

第6章,16章涉及相关。

Truthful 

对可能会发生变动的代码,不要测试。

Rails 5 Test Prescriptions 第4章 什么制造了伟大的测试的更多相关文章

  1. Rails 5 Test Prescriptions 第11章其他部分的测试。

    Routes✅ Helper Methods✅ Controllers and Requests✅ Simulating Requests⚠️,看之前的博客 What to Expect in a R ...

  2. Rails 5 Test Prescriptions 第9章 Testing-JavaScript: Integration Testing,❌挂一个问题webpacker::helper

    使用Capybara进行JS的集成测试 谈论驱动 让测试通过 Webpack in Development Mode Js设计 是用户在网页上有好的体验的重要因素. 尽管如此,许多网页不测试JS. 部 ...

  3. Rails 5 Test Prescriptions 第8章 Integration Testing with Capybara and Cucumber

    Capybara:  A complete reference is available atrubydoc.info. 集成测试就是把局部的程序组合起来测试. 端到端测试是一个特殊的集成测试,覆盖了 ...

  4. Rails 5 Test Prescriptions 第5章 Testing Models

    Rails,model层包含业务逻辑和储存逻辑.其中储存逻辑被ActiveRecord处理. 在model中,不是每件事都必须是ActiveRecord对象.model layer可以包含各种服务,对 ...

  5. Rails 5 Test Prescriptions 第3章Test-Driven Rails

    本章,你将扩大你的模型测试,测试整个Rails栈的逻辑(从请求到回复,使用端到端测试). 使用Capybara来帮助写end-to-end 测试. 好的测试风格,包括端到端测试,大量目标明确的单元测试 ...

  6. Rails 5 Test Prescriptions 第10章 Testing for Security

    Web 安全是一个可怕的主题.所有的你的程序都依靠密码学,代码超出了你的控制. 尽管如此,你还是可以控制部分网页安全 --所有的logins和access checks和injection error ...

  7. Rails 5 Test Prescriptions 第10章 Unit_Testing JavaScript(新工具,learn曲线太陡峭,pass)

    对Js的单元测试是一个大的题目.作者认为Ruby的相关测试工具比Js的测试工具更灵活 大多数Js代码最终是关于响应用户的行为和改变DOM中的元素 没有什么javascript的知识点.前两节用了几个新 ...

  8. Rails 5 Test Prescriptions 第7章 double stub mock

    https://relishapp.com/rspec/rspec-mocks/v/3-7/docs/basics/test-doubles 你有一个问题,如果想为程序添加一个信用卡程序用于自己挣钱. ...

  9. Rails 5 Test Prescriptions 第6章Adding Data to Tests

    bcreate the data quickly and easily.考虑测试运行的速度. fixtures and factories.以及下章讨论的test doubles,还有原生的creat ...

随机推荐

  1. 删除 Linux /tmp 目录下的临时文件

    使用 tmpreaper How to install and use tmpreaper How to Remove Files Older than N days using tmpreaper ...

  2. VC编译选项 多线程(/MT)

    VC编译选项 多线程(/MT)多线程调试(/MTd)多线程 DLL (/MD)多线程调试 DLL (/MDd)C 运行时库                        库文件Single threa ...

  3. MySQL删除数据表中重复数据

    今天遇到一个问题,数据表的数据有重复的,关键原因在于新增数据时,没有根据条件先判断数据是否存在,当数据存在时进行有关条件的更新,不存在时做新增数据. 对于表中已经存在的数据处理办法的方法: 1.先根据 ...

  4. 理解Java异常处理机制的机理

    重看异常机制的时候觉得抓到了点机理上的精髓,所以来说一下,对初学者应该会有些帮助   JAVA中的异常机制 从机制上由[产生异常][抛出异常][捕捉异常][异常处理]组成 从形式上又分为四种: 运行时 ...

  5. Django自带的加密算法及加密模块

    Django 内置的User类提供了用户密码的存储.验证.修改等功能,可以很方便你的给用户提供密码服务. 默认的Ddjango使用pbkdf2_sha256方式来存储和管理用的密码,当然是可以自定义的 ...

  6. centos 目录结构 快捷键 ls命令,alias别名,so:动态库 a:静态库,环境变量PATH,Ctrl+z 暂停命令,Ctrl+a 光标到行首,Ctrl+e 光标到行尾,Ctrl+u 删除光标前所有字符 Ctrl+r 搜索命 hash命令 Ctrl+左箭头/右箭头 cd命令 第三节课

    centos 目录结构 快捷键 ls命令,alias别名,so:动态库 a:静态库,环境变量PATH,Ctrl+z 暂停命令,Ctrl+a 光标到行首,Ctrl+e 光标到行尾,Ctrl+u 删除光标 ...

  7. AE读取CAD图层包括注记

    public override void FillDatabase(Teigha.DatabaseServices.Database pDb) { IFeatureClassContainer pFe ...

  8. 如何确定Hadoop中map和reduce的个数--map和reduce数量之间的关系是什么?

    一般情况下,在输入源是文件的时候,一个task的map数量由splitSize来决定的,那么splitSize是由以下几个来决定的 goalSize = totalSize / mapred.map. ...

  9. The adidas NMD Singapore is one of the brands top selling

    Like pointed out, we've two adidas NMD Singapore releases using the first arriving Blue and Black as ...

  10. ng-深度学习-课程笔记-12: 深度卷积网络的实例探究(Week2)

    1 实例探究( Cast Study ) 这一周,ng对几个关于计算机视觉的经典网络进行实例分析,LeNet-5,AlexNet,VGG,ResNet,Inception. 2 经典网络( Class ...