在阅读这篇之前,我希望你已经知道如何做表格驱动的测试以及使用 interface 进行 模拟 (mock)/ 桩 (stub) 注入。这里是一些窍门:

窍门 1. 不使用框架

来自 Ben Johnson 的窍门。Go 有一个着实很棒的测试框架,它让你能够使用同样的语言编写测试代码,无需学习任何的库或测试引擎,直接用!也可以参考 Ben Johnson 的帮助函数[7],可以帮你省一些代码行数。

窍门 2. 使用 "_test" 包名

Ben Johnson's tip. Using *_test package doesn't allow you to enter unexported identifiers. This puts you into position of a package's user, allowing you to check whether package's public API is useful.

来自 Ben Johnson 的提示。使用 *_test 包名,你无法使用包中未导出的标识符。这样在测试中,你就是包的使用者,让你更好地检查包的公有 API 是否可用。

窍门 3. 避免全局常量

来自 Mitchell Hashimoto 的窍门。如果你使用了全局的常量标识符,测试时将无法改变它们的行为。这个窍门的例外是全局常量对默认值是有用的。查看下面的例子:

这里是一些技巧,希望能够让你的测试代码更好:

技巧 1. Test fixtures

这个技巧在标准库[8] 中用到。这是我从 Mitchell Hashimoto 和 Dave Cheney 的作品中学到的。go test 很好地支持从文件中加载测试数据。第一,go build 忽略名为 testdata 的文件夹。第二,当 ge test 运行时,它将当前目录设置为包目录。这使得你可以使用相对路径 testdata 目录作为存储和加载数据的地方。这是一个例子:

技巧 2. Golden 文件

这个技巧也在标准库[9] 中被用到,但我是从 Mitchell Hashimoto 的演讲中学到的。这里的思想是将期望输出存储在一个名为 .golden 的文件中并提供一个 flag 来更新它。这里是例子:

这个技巧使你得以测试复杂的输出而无需硬编码。

技巧 3. 测试帮助函数

Mitchell Hashimoto 的技巧。有时候测试代码变得有点复杂。当你需要为测试案例做合适的配置,经常包含很多无关的 err 检查,例如检查测试文件是否正确加载,检查数据是否可以解析成 JSON,等等。这些代码很快就变得十分丑陋!

为了解决这个问题,你需要将无关的代码分离到帮助函数里。这些函数永远不应该返回 error,如果有一些操作失败,应该将 *testing.T 作为参数并让测试失败。

还有,如果你的帮助函数需要在后面做一些清理,你应该返回一个做清理工作的函数。看看下面的例子:

( 注:这个例子摘自 Mitchell Hashimoto - Advanced Testing with Go[10] 的演讲 )。这个例子里用到了另一个很酷的技巧就是 defer。在这段代码中 defer testChdir(t, “ /other")()执行 testChdir 函数并将其返回的清理函数延迟执行。

技巧 4. 子进程:真实调用

有时候你需要测试依赖于可执行程序的代码。例如,你的程序使用 Git。测试这段代码的一个办法是模拟 Git 的行为,但那真的很难!另一个办法是真正调用 Git 可执行程序。但如果执行测试的用户没有安装 Git 怎么办?

这个技巧解决了检查系统是否有安装 Git 的问题,如果没有安装则跳过测试。例子如下:

( 注:这个例子摘自 Mitchell Hashimoto - Advanced Testing with Go[11] 的演讲。)

技巧 5. 子进程:模拟

Andrew Gerrand / Mitchell Hashimoto 的技巧。下面的技巧让我们模拟一个子进程,无需跳过测试代码。这个例子也可以在 标准库测试[12] 中看到。假设我们要测试 Git 失败的场景。看看这个例子:

这里的思想把 Go 测试框架作为稍做修改(os.Args[0]- 是生成的 Go test 二进制)的子进程运行。稍做修改是为了在环境变量为 BE_CRASHING_GIT=1 时运行同样的测试(-test.run=TestFailingGit 的部分),这样你可以区分何时作为子进程运行,何时正常执行。

技巧 6. 将模拟、帮助函数放在 testing.go 文件中

Hashimoto 提的一个有趣的建议是将帮助函数,fixtures,桩都导出并放在 testing.go 文件中。(注意 testing.go 文件被当成正常的代码对待,而不是测试代码。)这使你可以在不同的包中使用模拟和帮助函数,包的使用者在他们的代码中也可以使用它们。

技巧 7. 处理那些运行慢的测试

Peter Bourgon 的技巧。当你有一些运行很慢的测试时,等待所有测试完成会变得很烦人,特别是当你想立刻知道编译是否成功时。这个问题的解决办法是将那些运行慢的测试移到 *_integration_test.go 文件中并在文件的开头添加编译选项。例如:

这样 go test 就不会包含有编译选项的那些测试。为了执行它们,你需要在 go test 命令中指定编译选项。

我个人使用 alias,用于运行当前包以及子包里除 vendor 目录以外的所有测试。

这个 alias 兼容 -v 选项。

感谢阅读!

deletefile失败 代码5怎么办_Go语言高级窍门与技巧,看完你也能写出高质量代码...相关推荐

  1. 小白程序员怎么由量变到质变写出高质量代码

    小白程序员怎么由量变到质变写出高质量代码?很多老程序员从事开发多年,有这样一种感觉,查看一些开源项目,如Spring.Apache Common等源码是一件赏心悦目的事情,究其原因,无外两点: 1.代 ...

  2. 如何才能写出高质量代码

    提醒:在发布作品前,请把不需要的内容删掉. 你是否曾经为自己写的代码而感到懊恼?你是否想过如何才能写出高质量代码?那就不要错过这个话题!在这里,我们可以讨论什么是高质量代码,如何写出高质量代码等问题. ...

  3. 如何写出高质量代码——站在巨人的肩膀上

    如何写出高质量代码--站在巨人的肩膀上 高质量代码的三要素:可读性,可维护性,可变更性 可读性强 可维护性:适应软件在部署和使用中的各种情况 1.3 可变更性:因需求变化而对代码进行修改 牛顿曾经说过 ...

  4. 从哪些维度评判代码质量的好坏?如何具备写出高质量代码的能力?

    文章目录 如何评价代码质量的高低? 最常用的评价标准有哪几个? 1. 可维护性(maintainability) 2. 可读性(readability) 3. 可扩展性(extensibility) ...

  5. 写出高质量代码的10个Tips

    7 条写作原则如下: 让段落成为写作的基本单位,每个段落只说 1 件事情: 省略不必要的词语: 使用主动式: 避免连串的松散句子: 把相关内容放在一起: 多用肯定语句: 善用平行结构: 对应的,在编码 ...

  6. Java基础知识(一),打好基础才能写出高质量代码

    前沿:不管工作多久,基础永远是最重要的,好多大厂看的就是基础好不好,所以写代码的同时,基础知识还是要去理解和记忆的,坚持每天来看一点 Java基础.语法: java面向对象的特征有哪些方面? 1.抽象 ...

  7. 由量变到质变 写出高质量代码

    本文由于总结<阿里Java开发手册>.<用友技术review手册>及个人Java开发工作经验,并结合这半年来的源码阅读经验进行编写.回顾那些写过的 读过的代码,回顾自己. 第一 ...

  8. 如何在面试时写出高质量的代码

    摘要:有些程序员由于平时没有养成良好的编程习惯,在面试时写出的代码质量不高,最终遗憾地与心仪的公司和职位失之交臂.如何在面试时能写出高质量的代码,是很多程序员关心的问题. 程序员在职业生涯中难免要接受 ...

  9. 如何才能写出“高质量”的代码?

    作为一个已经写了十几年代码的程序员,做好软件不是全部围绕代码而展开,换句话讲一个程序员的程序员优秀不仅仅体现在代码上,更要有内在的编程思想说的层次再高深点就是框架思想.很多初学者都会存在很多疑问,觉得 ...

最新文章

  1. JQueryEasyUI学习笔记(十四)tree
  2. 拼多多面试真题:如何用 Redis 统计独立用户访问量!
  3. 谈谈虚拟化及其安全性
  4. Java数据库查询简介
  5. c语言之判断电压最大值最小值,基于单片机的频率计的C语言源代码
  6. jeecg开源项目的IDEA的部署
  7. Java 蓝桥杯 算法 和为T
  8. 044、JVM实战总结:高级工程师的硬核技能:JVM的Young GC日志应该怎么看?
  9. 彻底搞懂使用MyBatis时为什么Dao层不需要@Repository
  10. java 加密压缩文件
  11. 计算机word设置段落为两栏,Word里怎么把一段分成两栏并加分隔
  12. PCB十六大可靠性测试,看看您的板是否经得起测试?
  13. C语言atan2()函数:求y/x的反正切值
  14. 联接(CROSS JOIN、JOIN、OUTER JOIN)
  15. app中的长连接与实现方式
  16. guid备份分区表crc错误_硬盘GPT和MBR分区表转换方法
  17. java.sql.SQLException: ORA-00918: 未明确定义列ORA-00918
  18. 什么是gpt一4-如何用上gpt-4
  19. 数学建模 非线性规划
  20. 提高影响力:职权+威信

热门文章

  1. hive load data外部表报错_从0开始学大数据-Hive基础篇
  2. oracle concat和,concat和||之間是否存在性能差異?在oracle
  3. matlab 小波启发式阈值滤波,小波阈值去噪
  4. java cookie过期_在Express中,会话Cookie过期
  5. GetProcAddress()函数动态调用DLL中的函数,是否必须通过extern C声明导出函数?
  6. 企业微信接收消息服务器配置php,微信企业号配置及在公众号里获取用户信息
  7. three.js场景中看不到模型/看不到阴影
  8. linux mv命令: 移动文件或文件改名
  9. JavaScript高级程序设计笔记 事件冒泡和事件捕获
  10. SOP 中的 Service