这章基于二分查找讨论了一个漂亮的测试应该怎么做。
先看看原文怎么做。这里的讨论省略了随机,性能,数组中元素重复,以及输入为null的情况。
public void testBinarySearch() {
int[] testArray = ...;
int target = ...;
int returnValue = Util.binarySearch(testArray, target);
// 当returnValue为-1的时候,数组中没有target.
assertTheory1(testArray, target, returnValue);
// 当returnValue大于等于0的时候,数组中returnValue的值等于target.
assertTheory2(testArray, target, returnValue);
// 当数组中没有target时,应该返回-1.
assertTheory3(testArray, target, returnValue);
// 如果testArray在位置n上包含target,那么binarySearch(testArray,target)必须返回n.
assertTheory4(testArray, target, returnValue);
}
private void assertTheory1(int[] testArray, int target, int returnValue) {
if (returnValue == -1) {
assertFalse(arrayContainsTarget(testArray, target));
}
}
private void assertTheory2(int[] testArray, int target, int returnValue) {
if (returnValue >= 0) {
assertEquals(target, testArray[returnValue]);
}
}
private void assertTheory3(int[] testArray, int target, int returnValue) {
if (!arrayContainsTarget(testArray, target)) {
assertEquals(-1, returnValue);
}
}
private void assertTheory4(int[] testArray, int target, int returnValue) {
assertEquals(getTargetPosition(testArray, target), returnValue);
}
private int getTargetPosition(int[] testArray, int target) {
for (int i = 0; i < testArray.length; i++) {
if (testArray[i] == target)
return i;
}
return -1;
}
作者先是建立了Theory1,2作为验证的手段,然后发现Theory1,2有漏洞,于是补充上Theory3,4形成一个测试组。
但是仔细研究这段代码发现还是有问题的。
一个很微小的瑕疵就是Theory4的定义和实现不一致,Theory4的code验证包含了Theory4的理论推理。
本来这个也没有什么了不起,但是让我们从头开始回顾为什么要测试二分查找。
答:简单的查找不容易错但是慢,所以我们需要速度快的二分查找。
但是二分查找涉及了一些求中值啊,改变上下限的操作,容易出错,所以我们需要测试二分查找。
Aha,getTargetPosition本身就是一个符合二分查找规范的简单查找(除了性能),而且因为其简单,我们肉眼检查可以确信该实现是正确的。思路来了,用一个正确的慢的实现去验证一个快的实现。
原来的Theory1,2,3,4变成了一个,任何情况下,二分查找应该和一个符合二分查找功能规范(除了性能)的简单查找的结果相同。
Refine后的代码如下。
public void testBinarySearch() {
int[] testArray = new int[10];
int target = 0;
int returnValue = Util.binarySearch(testArray, target);
assertEquals(getTargetPosition(testArray, target), returnValue);
}
private int getTargetPosition(int[] testArray, int target) {
for (int i = 0; i < testArray.length; i++) {
if (testArray[i] == target)
return i;
}
return -1;
}
嗯,code变少了,更简洁漂亮了,I like it。
分享到:
相关推荐
这个项目是一个基于Java的检测器,可以检测Fowler等人的五个。 (1999) 的代码不良气味:数据块、开关语句、推测一般性、消息链和中间人,来自 Java 源代码。
这是C语言程序设计经典236例书本里的案例的代码的电子版,代码里有注释,很生动,这是7-9章的
软件测试中单元测试VS私有方法软件测试前几天,NareshJain在ManagedChaos上发了篇博客,总结了一些测试中的badsmell。例如:●一个方法中有太多testcase——被测试的方法做了太多事情。●太多的setup/teardown——...
论文《A Textual-based Technique for Smell Detection》pdf全
分享了气味剂算法源代码及其原文,更多算法可进入空间查看
自动代码气味检测器自动代码气味检测器是IntelliJ IDEA插件,致力于自动检测和纠正Java代码中的代码气味。下载及安装可以按照以下步骤直接在IntelliJ IDEA中下载该插件: 按Ctrl + Alt + S或选择文件| 设置(适用于...
【智能优化算法-气味代理优化算法】基于气味代理优化算法求解单目标优化问题附matlab代码(SAO,Smell Agent Optimization)标准.zip
1.版本:matlab2014/2019a/2021a ...3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
Bad File Permission Command Injections Cross-site scripting Constructing SQL upon Input Debug Set to True in Deployment Exec Statement Empty Password Hard-coded Secrets Hard-coded IP Address Binding ...
fluent udf 多孔介质模型,用来解决多孔介质模拟的模型建立
code_smell_extractor_ci 代码气味提取器在github上的项目安装要做Git: : PMD: : 系统开发Linux运行程序您必须在linux上,并且必须修改src / main / java / utilities / Utility.java中的变量: PATH_PMD =“ [您...
沪教版一年级英语下册(牛津版) Unit 3 Taste and smell 第1课时 教案 教学设计 .pdf
findbugs是一个开源的eclipse 代码检查工具;它可以简单高效全面地帮助我们发现程序代码中存在的bug,bad smell,以及潜在隐患. 下载的文件包含如下: 1.findbugs的eclipse插件source包 2.安装及使用说明文档
测试气味被定义为单元测试代码中的不良编程实践(例如,测试用例的组织方式,实现方式以及彼此之间的交互方式),这些行为表明了测试源代码中潜在的设计问题。 项目概况 该项目的目的是双重的: 通过提出开发人员...
代码味道重构练习 此存储库中的每个分支都有给定语言的练习。 原始源材料(在java分支中)是来自(C) Jason Gorman。 有关 TDD 和重构代码异味,请查看。
findbugs是一个开源的代码检查工具;它可以简单高效全面地帮助我们发现程序代码中存在的bug,bad smell,以及潜在隐患。
1.重构要求 2.重构的工作 3.代码的bad smell 4. 重构的例子
检测JavaScript类的内聚耦合Code Smell.pdf
It indeed a bad smell, but before you refactor them, you may need to make them testable firstly. Now, jmockit comes to us. "Tests can easily be written that will mock final classes, static methods...
学习气味-入门套件 :flexed_biceps: 挑战页面: : :speaking_head: 讨论论坛: : :trophy: 页首横幅: : :laptop: 安装git clone ... 这将为您提供类似于以下内容的文件夹结构: .├── data│ ├── test.csv│ ...