程序员工作法-迭代与测试
程序员工作法
迭代0
需求方面
确定需求优先级,然后细化需求,细化即确定需求的验收标准。
技术方面
1.技术选型(比如用 MySQL 还是 Redis,需要用的 MQ 么等等)
2.数据库表设计(建议记录数据库表变更,比如每一次变更都写入一个新的文件,方便新成员理解,以及回滚)
3.测试(可以考虑设置一个测试覆盖率)
测试
1.任务分解
将一个任务拆解成多个子任务,直到每个子任务可以单独进行测试为止。这个是测试的前提,需要多加练习,也可以拿生活中的例子练习任务分解方法。
对于熟悉的业务场景,不需要列分解后的子任务,可以只记录一些容易遗漏的细节;而陌生的业务场景可以考虑列下子任务的简要信息以及一些关键的细节。
2.TDD测试
TDD(Test Driven Development)测试驱动开发,即先编写测试例子,和测试代码,再开发功能代码并运行测试验证,最后回顾代码进行重构,消除代码存在的坏味道。
好的测试
1.自动化
测试交给机器,尽量不要有人工干预。
2.全面的
(1)写代码前需要考虑所有场景:正确的,异常的,边界条件
(2)最后检查测试是否覆盖所有代码和执行分支
3.可重复的
测试重复运行结果必须一致,即不应该依赖外部环境,外部环境应该借助 Mock 进行模拟,或者利用测试框架进行恢复。
4.独立的
测试之间不应该有依赖关系,比如测试B需要依赖测试A运行后再运行。
5.专业的
测试代码也要像功能代码一样保证代码整洁和质量,可读性等。
TDD实战
下面以判断一个数字是否为素数举例。
1.定义功能类结构
package org.example;
public class NumberUtil {
public boolean isPrime(int num) {
return false;
}
}
2.编写测试样例
/**
* 1. 编写测试样例
*
* 1)正确与错误例子
* isPrime(3) true
* isPrime(4) false
*
* 2)边界例子
* isPrime(-2) false
* isPrime(0) false
* isPrime(1) false
* isPrime(2) true
*/
@Test
public void testIsPrime() {
}
3.编写测试代码
@Test
public void testIsPrime() {
// 2. 编写测试代码
assert numberUtil.isPrime(3);
assert !numberUtil.isPrime(4);
assert !numberUtil.isPrime(-2);
assert !numberUtil.isPrime(0);
assert !numberUtil.isPrime(1);
assert numberUtil.isPrime(2);
}
4.编写功能代码
public class NumberUtil {
public boolean isPrime(int num) {
for (int i=2; i<num; i++) {
if ((num % i) == 0) {
return false;
}
}
return true;
}
}
5.运行测试,直到通过所有样例
java.lang.AssertionError
at org.example.TestNumberUtil.testIsPrime(TestNumberUtil.java:34)
当测试样例不通过时,回过头修改功能代码,直到通过所有测试样例。
6.回顾功能代码,消除可能存在的坏味道
有哪些坏味道呢?这里就不举例了,绝对不是因为一时想不出来啦~
7.开发下一个功能