1.概念
什么是测试
在学习什么是“测试驱动开发”前,我们先看看什么是“测试”。因为连起来就可能不好理解,就和上学的时候,一个很长的句子,可以分成几段,单独理解是一个意思;例如:什么是笔记本电脑,我们拆分为“什么是电脑”,什么是“笔记本”来理解。
为什么要有代码测试
目的是保证代码质量。
防止重构时引入了Bug。
替代人工完成重复的工作。
什么是测试驱动开发
测试驱动开发,英文全称Test-Driven Development,简称TDD,是一种不同于传统软件开发流程的新型的开发方法。它要求在编写某个功能的代码之前先编写测试代码,然后只编写使测试通过的功能代码,通过测试来推动整个开发的进行。这有助于编写简洁可用和高质量的代码,并加速开发过程。
好处
能最大程度保证代码的质量;同时在写测试的时候,也能有助于我们理清思路,找到最好的实现方法。
坏处
会加工作量;不是所有人都喜欢这种开发模式;需要团队有一个很高的水准。
2.单元测试和UI单元测试
Android中的测试驱动开发
主要分为两类,一类是与UI无关的测试,通常称为“单元测试”,剩下的就是与UI相关的测试。
单元测试 (与UI无关,也就是说可以在电脑上测试,也可以在android上测试)
一般是测试和Android无关的功能,例如:手机号格式判断,时间日期格式化;这类代码直接在电脑测试,不用运行到手机;同一种语言,测试方法一样;例如:用Java写的手机号格式判断代码,可以用到Android项目,也可以用到Java项目中。
UI单元测试
这个就是和平台有关的,例如:要测试按钮的点击事件,这样的代码,只能运行到Android平台。
区别
测试方法,使用的测试接口不一样;运行的平台也不一样。
3.一般步骤
1.创建被测试文件
2.定义被测试方法
这2步就是:创建被测试文件类在里面添加 测试方法
3.创建测试相关文件
4.添加测试代码
5.确认测试失败
后面3步:命名为测试的文件后面加Test,比如被测试文件StringUtil, 那么测试文件为StringUtilTest,
最后在测试方法执行测试。
例如:
被测试文件StringUtil
/**
* 字符串工具类
* 注意:这个和StringUtils的区别,StringUtils是导入依赖commons-lang3 包中的类
*/
public class StringUtil {
/**
* 是否是手机号(判断手机号格式是否正确)
*
* @param value Value
* @return 返回是否符合手机号 默认返回false
*/
public static boolean isPhone(String value) {
//看传入的值和正则表达式,是否匹配的上,如果可以的话,就返回true,否则false
return false//这里返回false,不管外面传入什么值,这里都是false,那么判断是true的时候肯定是不通过的
//return value.matches(REGEX_PHONE);//这里使用正则表示匹配
}
}
测试文件 StringUtilTest
public class StringUtilTest {
/**
* 测试是否是手机号
*/
@Test
public void testIsPhone() {
//这是一个正确的手机号格式
//所以用断言判断结果为true
//只有结果为true才表示测试通过
//也就表示我们的代码没问题
//这里的assert其实是junit中的
assertTrue(StringUtil.isPhone("13141111111"));
//这是一个错误的手机号格式
//所以用断言判断结果为false
assertFalse(StringUtil.isPhone("ixuea"));
}
}
//用到的匹配手机号的正则表达式
/**
* 手机号正则表达式
* 移动:134 135 136 137 138 139 147 150 151 152 157 158 159 178 182 183 184 187 188 198
* 联通:130 131 132 145 155 156 166 171 175 176 185 186
* 电信:133 149 153 173 177 180 181 189 199
* 虚拟运营商: 170
* <p>
* ^:匹配一行的开头
* $:匹配一行的结尾
* <p>
* \\d{8}$:匹配后面8位数字
*/
public static final String REGEX_PHONE = "^(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[89])\\d{8}$";
总结:
单元测试
总的来说:这个类 方法中的判断,在我们的测试文件通过以后,才能难道功能代码使用,这样可以减少出错。
单元测试实例:
文件大小格式化
FileUtil 被测试类
/**
* 文件工具类
*/
public class FileUtil {
/**
* 文件大小格式化
*
* @param value 文件大小;单位byte
* @return 格式化的文件大小;例如:1.22M
* K M G 统一为大写 防止出错
*/
public static String formatFileSize(long value) {
if (value > 0) {
double size = (double) value;//记得要先转换成double类型的
double kiloByte = size / 1024;
if (kiloByte < 1 && kiloByte > 0) {//kiloByte > 0有这个
//不足1k
// return size + "Byte";//不能用这个,用这个会报错
return String.format("%.2fByte", size);
}
//%.2f :%.2f自动四舍五入(保留2位小数并四舍五入)
double megaByte = kiloByte / 1024;
if (megaByte < 1) {
//不足1M(注意:不足1M,用的是kiloByte)
return String.format("%.2fK", kiloByte);
}
double gigaByte = megaByte / 1024;
if (gigaByte < 1) {
//不足1G,用的是M
return String.format("%.2fM", megaByte);
}
double teraByte = gigaByte / 1024;
if (teraByte < 1) {
//不足1T
return String.format("%.2fG", gigaByte);
}
}
return "1k";
}
}
测试工具类
/**
* 测试文件工具类
*/
public class FileUtilTest {
/**
* 测试文件大小格式化
* K M G 统一为大写 防止出错
*/
@Test
public void testFormatFileSize() {
//第一个参数等于第二个参数
assertEquals(FileUtil.formatFileSize(1), "1.00Byte");
//第一个参数等于第二个参数
//为什么不等于1.23呢?
//其实是因为单位换算的时候除以的是1024
//1234/1024=1.205078125
//可以看到格式化的时候四舍五入了
assertEquals(FileUtil.formatFileSize(1234), "1.21K");
//第一个参数不等于第二个参数
assertNotEquals(FileUtil.formatFileSize(1234), "1.23K");
}
}
网友评论