TDD测试驱动开发
基于TDD开发一个判断字符串是IP4地址的功能
测试清单
- 首先要有
.
- 字符串中只有
.
和数字 - 有三个
.
.
隔开了数字(不能两个.
连着)- 隔开的每个数字在0~255内
- 首先要有
.
测试代码为:
// 字符串中应该含有 .
assertFalse(Ipv4Judger.jugde("22"));
// 正确测试
assertTrue(Ipv4Judger.jugde("233.21.1.2"));
Ipv4Judger类为:
public class Ipv4Judger {
public static boolean jugde(String ipv4) {
// 字符串含有 .
if (!ipv4.contains(".")) {
return false;
}
return true;
}
}
- 字符串中只有字符串中只有
.
和数字
测试代码为:
// 字符串含有 .
assertFalse(Ipv4Judger.jugde("22"));
// 字符串中只有 . 和 数字
assertFalse(Ipv4Judger.jugde("234.132"));
Ipv4Judger类为:
public class Ipv4Judger {
public static boolean jugde(String ipv4) {
// 字符串含有 .
if (!ipv4.contains(".")) {
return false;
}
// 字符串中只有 . 和 数字
if (!onlyNumAndDot(ipv4)) {
return false;
}
return true;
}
private static boolean onlyNumAndDot(String ipv4) {
return "".equals(ipv4.replace(".", "").replaceAll("\\d", ""));
}
}
- 有三个
.
测试代码为:
// 字符串含有 .
assertFalse(Ipv4Judger.jugde("22"));
// 字符串中只有 . 和 数字
assertFalse(Ipv4Judger.jugde("234.132"));
// 字符串中的 '.' 的数量为3
assertFalse(Ipv4Judger.jugde("2.11.9"));
// 正确测试
assertTrue(Ipv4Judger.jugde("233.21.1.2"));
Ipv4Judger 类为:
public class Ipv4Judger {
public static boolean jugde(String ipv4) {
// 字符串含有 .
if (!ipv4.contains(".")) {
return false;
}
// 字符串中只有 . 和 数字
if (!onlyNumAndDot(ipv4)) {
return false;
}
// 字符串中的 '.' 的数量为3
if (getCount(ipv4, ".") != 3) {
return false;
}
return true;
}
private static boolean onlyNumAndDot(String ipv4) {
return "".equals(ipv4.replace(".", "").replaceAll("\\d", ""));
}
private static int getCount(String s, String key) {
return s.split(key).length - 1;
}
}
.
隔开了数字(不能两个.
连着)
测试代码为:
// 字符串含有 .
assertFalse(Ipv4Judger.jugde("22"));
// 字符串中只有 . 和 数字
assertFalse(Ipv4Judger.jugde("234.132"));
// 字符串中的 '.' 的数量为3
assertFalse(Ipv4Judger.jugde("2.11.9"));
// '.'之间有数字
assertFalse(Ipv4Judger.jugde("...."));
// 正确测试
assertTrue(Ipv4Judger.jugde("233.21.1.2"));
Ipv4Judger 类为:
public class Ipv4Judger {
public static boolean jugde(String ipv4) {
// 字符串含有 .
if (!ipv4.contains(".")) {
return false;
}
// 字符串中只有 . 和 数字
if (!onlyNumAndDot(ipv4)) {
return false;
}
// 字符串中的 '.' 的数量为3
if (getCount(ipv4, ".") != 3) {
return false;
}
// '.'之间有数字
if (dotSplitNum(ipv4)) {
return false;
}
return true;
}
private static boolean dotSplitNum(String ipv4) {
String[] strs = ipv4.split("\\.");
int tmp;
for (String s : strs) {
if ("".equals(s)) {
return true;
}
}
return false;
}
private static boolean onlyNumAndDot(String ipv4) {
return "".equals(ipv4.replace(".", "").replaceAll("\\d", ""));
}
private static int getCount(String s, String key) {
return s.split(key).length - 1;
}
}
.
隔开的每个数字在0~255内
测试代码为:
// 字符串含有 .
assertFalse(Ipv4Judger.jugde("22"));
// 字符串中只有 . 和 数字
assertFalse(Ipv4Judger.jugde("234.132"));
// 字符串中的 '.' 的数量为3
assertFalse(Ipv4Judger.jugde("2.11.9"));
// '.'之间有数字
assertFalse(Ipv4Judger.jugde("...."));
// '.' 隔开的数字在 0~255 之间
assertFalse(Ipv4Judger.jugde("277.23.666.21"));
// 正确测试
assertTrue(Ipv4Judger.jugde("233.21.1.2"));
Ipv4Judger 类为:
public class Ipv4Judger {
public static boolean jugde(String ipv4) {
// 字符串含有 .
if (!ipv4.contains(".")) {
return false;
}
// 字符串中只有 . 和 数字
if (!onlyNumAndDot(ipv4)) {
return false;
}
// 字符串中的 '.' 的数量为3
if (getCount(ipv4, ".") != 3) {
return false;
}
// '.'之间有数字
if (dotSplitNum(ipv4)) {
return false;
}
// '.' 隔开的数字在 0~255 之间
if (overflow(ipv4)) {
return false;
}
return true;
}
private static boolean dotSplitNum(String ipv4) {
String[] strs = ipv4.split("\\.");
for (String s : strs) {
if ("".equals(s)) {
return true;
}
}
return false;
}
private static boolean overflow(String ipv4) {
String[] strs = ipv4.split("\\.");
int tmp;
for (String s : strs) {
tmp = Integer.parseInt(s);
if (tmp >= 255 || tmp <= 0) {
return true;
}
}
return false;
}
private static boolean onlyNumAndDot(String ipv4) {
return "".equals(ipv4.replace(".", "").replaceAll("\\d", ""));
}
private static int getCount(String s, String key) {
return s.split(key).length - 1;
}
}
重构,优化设计结构:
可以发现方法overflow和dotSplitNum 都遍历了.
分割的数组,有相同的代码
可以合并为一个新的方法dotSplitNumAndNumIsValid
private static boolean dotSplitNumAndNumIsValid(String ipv4) {
String[] strs = ipv4.split("\\.");
int tmp;
for (String s : strs) {
if ("".equals(s)) {
return true;
}
tmp = Integer.parseInt(s);
if (tmp >= 255 || tmp <= 0) {
return true;
}
}
return false;
}
测试后通过。