聊聊测试:入门和实践
在我个人职业生涯的前两年,我几乎没有写过几个正规的测试用例,大部分时候都是赶进度用人工测试,当然所在的团队规模也不是特别大,所有的测试都是 developer 自己完成。那个时候我对测试虽然稍有存疑,但还是抱着想试试的态度,当时摆在我面前的问题是:测什么和如何测。
随着日后经历的团队规模不断变大,开发的软件服务的复杂度和用户量的不断变高,对测试的理解也从不知如何想入手到持续推进自动化和 CI 在团队中不断普及和应用,甚至强行将测试覆盖率和测试质量纳为开发人员的考核指标,在此我们一起好好聊聊软件生命质量的保证:测试。
为什么很多 developer 不写测试,甚至厌恶写测试
不想测试的 developer 常常由自己的一套理由或者借口。
观点一:我的代码跑得很好,为什么要测试
对这样的观点最有力的回应是,你怎么知道你的代码跑得好好的,你测试过么,除非你现在测试一下你的代码证明它跑得很正确。但事实上自动化测试带来的好处绝对是显而易见的:
- 可重复执行,有利于代码反复修改和迭代
- 可随时发布,让你的代码第一时间接触用户
- 节省时间
……
wecatch 开源的 app-turbo 在上线到生产环境第一个版本之后(彼时测试覆盖率不足20%),每迭代一个小版本大概需要一周时间,当测试覆盖率达到 30% 已经可以 3 天发一个小版本,现在 50% 的覆盖率如果不是大功能变动,一天发可以一个版本。
Go interface 详解(二) :定义和使用
本系列是阅读 “The Go Programming Language” 理解和记录。
定义 interface
正如上文所说,Go interface 是一种类型,一个 interface type 指定了一组 method 集合,如果说一个 concrete type 是一个 interface 的 instance,我们说这个 concrete type 实现了这个 interface 的所有方法。
在 Go 的标准库 io
package 中定义了很多有用的 interface:1
2
3
4
5
6
7
8
9
10
11
12
13package io
type Reader interface {
Read(p []byte)(n intm err error)
}
type Writer interface {
Write(p []byte) (n int, err error)
}
type Closer interface {
Close() error
}
Go interface 详解(一) :介绍
本系列是阅读 “The Go Programming Language” 理解和记录。
Go 中的 interface 是一种类型,更准确的说是一种抽象类型 abstract type,一个 interface 就是包含了一系列行为的 method 集合,interface 的定义很简单:
1 | package io |
Go 中的 interface 不同于其它语言,它是隐式的 implicitly,这意味着对于一个已有类型,你可以不用更改任何代码就可以让其满足某个 interface。
如果一个 concrete type 实现了某个 interface,我们说这个 concrete type 实现了 interface 包含的所有 method,必须是所有的 method。
在 Go 的标准库 fmt
中有一系列的方法可以很好的诠释 interface 是如何应用到实践当中的。
使用 Python bumpversion 轻松实现版本管理
深入理解 Python package
Python 是通过 module 组织代码的,module 即一个 py 文件,module 又是通过 package 来组织的,package 是一个包含 __init__.py
的文件夹,代码,module,package 它们三者的关系就是:module 包含代码,package 至少包含一个为 __init__.py
的 module。
1 | package |
Python 的 package 以及 package 中的 __init__.py
共同决定了 package 中的 module 是如何被外界访问的。