Golang TDD实践报告:快速排序Quick Sort
Golang TDD实践报告:快速排序Quick Sort 【阅读时间:约5分钟】
- 0.项目需求
- 1.编写符合项目输入输出的一个测试
- 2.尝试运行测试
- 3.先使用最少的代码来让失败的测试先跑起来
- 4.编写足够的代码以使测试通过
- 5.重构编写完整的代码以提高效率
- 6.基准测试
TDD是测试驱动开发(Test-Driven Development)的英文简称,是敏捷开发中的一项核心实践和技术,也是一种设计方法论。
TDD设计周期如下(假设项目需求已知):①编写符合项目输入输出的一个测试
②尝试运行测试
③先使用最少的代码来让失败的测试先跑起来
④编写足够的代码以使测试通过
⑤重构编写完整的代码以提高效率
⑥基准测试
在之前的C/C++编程中学习了许多有用的算法,比如排序算法。
最近笔者在入门Golang的开发应用,在掌握基本语法后感觉还是缺少了些东西,于是想尝试通过TDD设计风格来逐步实现一个常用的排序算法——快速排序(Quick Sort)算法。
0.项目需求
项目需求:设计一个名为QuickSort的函数,实现快速排序算法。
用法:给定一个长度(如L=10)的整数数组,调用QuickSort函数将其排序为数值从小到大的数组。
1.编写符合项目输入输出的一个测试
创建文件夹quicksort,将其作为项目目录。
在 QuickSort_test.go 中:
package quicksortimport "testing"func TestQuickSort(t *testing.T) {arr0 := []int{1, 9, 2, 8, 3, 7, 4, 6, 5, 0}arr1 := []int{1, 9, 2, 8, 3, 7, 4, 6, 5, 0}got := QuickSort(arr1, 0, 9)want := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}for i := 0; i < 10; i++ {if got[i] != want[i] {t.Errorf("\n got %v\n want %v\n given %v", got, want, arr0)break}}
}
也上面的迭代可以改为更为简洁的形式,导入import "reflect"并使用reflect.DeepEqual(got, want)比较即可:
package quicksortimport ("reflect""testing"
)func TestQuickSort(t *testing.T) {arr0 := []int{1, 9, 2, 8, 3, 7, 4, 6, 5, 0}arr1 := []int{1, 9, 2, 8, 3, 7, 4, 6, 5, 0}got := QuickSort(arr1, 0, 9)want := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}if !reflect.DeepEqual(got, want) {t.Errorf("\n got %v\n want %v\n given %v", got, want, arr0)}
}
2.尝试运行测试
在项目目录下,使用go test指令运行测试,报错信息如下:
[henryhzy@localhost quicksort]$ go test
# github.com/user/quicksort [github.com/user/quicksort.test]
./QuickSort_test.go:9:2: undefined: QuickSort
FAIL github.com/user/quicksort [build failed]
3.先使用最少的代码来让失败的测试先跑起来
在 QuickSort.go 中:
package quicksortfunc QuickSort(arr []int, l, r int) ([]int){return arr
}
再次在项目目录下,使用go test指令运行测试,报错信息如下:
[henryhzy@localhost quicksort]$ go test
--- FAIL: TestQuickSort (0.00s)QuickSort_test.go:14: got [1 9 2 8 3 7 4 6 5 0]want [0 1 2 3 4 5 6 7 8 9]given [1 9 2 8 3 7 4 6 5 0]
FAIL
exit status 1
FAIL github.com/user/quicksort 0.002s
4.编写足够的代码以使测试通过
在 QuickSort.go 中:
package quicksortfunc QuickSort(arr []int, l, r int) []int {Sort(arr, l, r)return arr
}func Sort(arr []int, l, r int) {if l >= r {return}i := Partition(arr, l, r)Sort(arr, l, i-1)Sort(arr, i+1, r)
}func Partition(arr []int, l, r int) int {i, j, key := l, r, arr[l]for i < j {for i < j && arr[j] > key {j--}arr[i] = arr[j]for i < j && arr[i] < key {i++}arr[j] = arr[i]}arr[i] = keyreturn i
}
在项目目录下,使用go test指令运行测试,提示正确的信息如下:
[henryhzy@localhost quicksort]$ go test
PASS
ok github.com/user/quicksort 0.002s
5.重构编写完整的代码以提高效率
考虑到每次递归调用Sort函数时,每个Sort函数都需要调用一次Partition函数,而事实上Partition函数可以融合到Sort函数中,从而减少函数调用的时间,提高了代码的运行效率。
在 QuickSort.go 中:
package quicksortfunc QuickSort(arr []int, l, r int) []int {Sort(arr, l, r)return arr
}func Sort(arr []int, l, r int) {if l >= r {return}i, j, key := l, r, arr[l]for i < j {for i < j && arr[j] > key {j--}if i<j {arr[i] = arr[j]i++}for i < j && arr[i] < key {i++}if i<j {arr[j] = arr[i]j--}}arr[i] = keySort(arr, l, i-1)Sort(arr, i+1, r)
}
在项目目录下,使用go test指令运行测试,提示正确的信息如下:
[henryhzy@localhost quicksort]$ go test
PASS
ok github.com/user/quicksort 0.002s
6.基准测试
func BenchmarkQuickSort(b *testing.B) {arr:= [10]int{1, 9, 2, 8, 3, 7, 4, 6, 5, 0}for i := 0; i < b.N; i++ {QuickSort(arr, 0, 9)}
}
在项目目录下,使用“go test -bench=.”指令运行基准测试,其结果如下:
[henryhzy@localhost quicksort]$ go test -bench=.
goos: linux
goarch: amd64
pkg: github.com/user/quicksort
BenchmarkQuickSort 8373924 162 ns/op
PASS
ok github.com/user/quicksort 1.505s
相关文章:
quick-cocos2d-x游戏开发【3】——display.newSprite创建向导
游戏嘛。没有图片没有图片可以称为你的游戏,所以,我们看一下使用quick如何创建精灵的方式。quick的api精灵族的创造仍然是非常具体的解释。因此,建立非常easy。display.newSprite(filename, x, y, params) filename:精灵文件名称 …

JSON http://www.cnblogs.com/haippy/archive/2012/05/20/2509329.html
js: JSON.stringify(idinfo)//将对象转化为 JSON串 //查询后为将json串赋值给表单 function _form1_load() { AOS.ajax({ url: getForm1Info.jhtml, ok: function (data) {//{cardno_5300129, sex_2, age_如花, name_凤} …

mysql update 并发 慢_MySQL跑在CentOS 6 和 7上的性能比较
点击蓝色“程序猿DD”关注我哟加个“星标”,不忘签到哦来源:yangyidba关注我,回复口令获取可获取独家整理的学习资料:- 001 :领取《Spring Boot基础教程》- 002 :领取《Spring Cloud基础教程》一 前言计划今…

远程控制virtual box虚拟机系统的三种方式
远程控制virtual box虚拟机系统的三种方式【阅读时间:5分钟】1.使用现有的远程控制软件2.使用SSH连接3.使用远程桌面控制虚拟机系统对于把虚拟机安装在寝室笔记本的人来说,能够远程控制虚拟机的系统是很重要的一件事,而远程控制虚拟机的方式一…

Kernel那些事儿之内存管理(7) --- Slab(上)
前面讲的buddy system算法,分配内存的最小单位是一个页面(例如 4K)。这对于大的内存申请比较适用。可是实际生活中,Kernel经常需要分配小的内存空间,比如几十个字节,这个时候怎么办呢?不同的人可…

Vyond制作2D动画学习教程
Vyond为2D动画提供了极其简单的分解视频创建过程。 你会学到什么 课程获取:Vyond制作2D动画学习教程-云桥网 您将学习如何为2d动画制作画外音 您将学习如何使用Vyond轻松创建精彩的动画视频 流派:电子学习| MP4 |视频:h264,1280720 |音频:AAC…

Blender3.0电影级别CG场景制作视频教程
Blender 3.0的电影场景制作–8小时以上的主教程 三本教程合三为一 你会学到什么 你将学习如何在Blender中建模 你将学习如何在Blender中创建更复杂的纹理 你将学习如何创建一个场景,设置摄像机和灯光 你将在Blender中学习动画的基础知识 你将会学到如何在Blender中…

Android WebView使用与JavaScript使用
WebView基本使用 WebView是View的一个子类,可以让你在activity中显示网页。 可以在布局文件中写入WebView:比如下面这个写了一个填满整个屏幕的WebView: <?xml version"1.0" encoding"utf-8"?> <WebView x…

YOLOv8-Detect训练CoCo数据集+自己的数据集
至此,整个训练预测阶段完成。此过程同样可以在linux系统上进行,在数据准备过程中需要仔细,保证最后得到的数据准确,最好是用显卡进行训练。有问题评论区见!

lvs服务器需要开启web服务么_Nginx+Keepalived实现web服务器高可用
1、Nginx业务背景现公司需求快速搭建web服务器,对外提供给用户web服务。需求拆分需要基于http协议的软件,搭建服务实现介绍常见用法:1) web服务器软件 httpd http协议同类的web服务器软件:apache(老牌) nginx(俄罗斯) IIS(微软)2)…

centos使用镜像源轻松配置golang+vscode的方法
Title:centos使用镜像源轻松配置golangvscode的方法 (阅读时间:约5分钟) 零.序言 最近笔者在上一门名为服务计算的课程,在老师的作业博客中提到,安装golangvscode环境总会遇到各种网络问题,在…

MySQL_update同一张表
update tb1 inner join(select type, count(*) as cntfrom tb1 group by type)as der using(type)set tb1.cnt der.cnt转载于:https://www.cnblogs.com/MarchThree/p/4641515.html

在SolidWorks 3D CAD中构建乐高直升机
以有趣而独特的方式练习您的3D CAD技能 你会学到什么 练习SolidWorks三维CAD的使用 学习如何使用机械伴侣 创建直升机的零件 将零件组装成工作模型 类型:电子教学| MP4 |视频:h264,1280720 |音频:AAC,48.0 KHz 语言:英语中英文字幕…

CSS局限属性contain:优化渲染性能的利器
在网页开发中,优化渲染性能是一个重要的目标。CSS局限属性contain是一个强大的工具,可以帮助我们提高网页的渲染性能。本文将介绍contain属性的基本概念、用法和优势,以及如何使用它来优化网页的渲染过程。

利用java多线程向MongoDB中批量插入静态文件
第一步、开发环境: win7 64位(注:MongoDb在32位windows上有数量限制(2G),详见官方文档) Mongodb3.2 mongofb_java_driver 3.2.2 第二部、安装mongodb,并开启服务 略:可参见官方文档 第三部、代码 import java.io.BufferedReader; …

为啥我从后台查到的值在页面显示的是undefined_再谈一个管理后台列表功能应有的素质...
大家能看到的这个号第1篇文章《无心朝政,列表功能分析下》就是讲列表功能。虽然当时写的时候特别认真,但基本是围绕“列表功能”这个广泛的词来阐述的。最近在做一个体育赛事赛程的后台管理系统 Match-Schedule,对管理后台列表有更多的体会…

Go语言的错误异常处理机制及其应用
一、背景 在日常编写golang程序或阅读别人的golang代码时,我们总会看到如下的一堆代码块: xx, err func(xx) if err ! nil {//do sth. to tackle this problem }这种经典的显式错误处理方式,在golang开发中几乎无处不在,了解过…

【Win10 应用开发】语音命令与App Service集成
昨天,老周演示了语音命令集成这一高大上功能,今天咱们来点更高级的语音命令。 在昨天的例子中,响应语音命令是需要启动应用程序的,那么如果可以不启动应用程序,就直接在小娜面板上进行交互,是不是会更高大小…

Maya 2022中的硬表面建模技术学习视频教程
Maya 2022中的硬表面建模 信息: 使用正确的拓扑和边流在Maya中建模硬曲面对象。 你会学到什么 硬质表面工具和技术 细分工作流程 边缘流动控制 正确拓扑 材料设置 Studio Lightning 渲染 持续时间16小时30分钟 1280X720 MP4 大小解压后:11.5G 语言:英…

六年级小学python第四讲_python第四讲
列表的排序 升序:从小到大的排序 降序:从大到小的排序 示例: num_list [120,250,11,44,77,45,22,390] num_list.sort() # 升序 - 从小到大 print(num_list) # 对列表本身做了修改 num_list.sort(reverseTrue)#降序 为False#升序 print(num_list) 反转 p…

android之AlertDialog 点击其它区域自己主动消失
遇到一个问题记录下来,在开发中使用了AlertDialog,想点击屏幕其它区域的时候让这个dialog消失,一開始不做不论什么设置,在小米手机能够正常显示,可是在三星中却有问题。后来发现少了一个属性: View dilaogV…

中级实训第一天的自学报告
目录【阅读时间:约10分钟】中级实训第一天的自学报告姓名:隐藏敏感信息 学号:隐藏敏感信息一、Vi/Vim二、Java三、Ant四、Junit【附加】五、SonarQube【附加】六、 编译运行BugRunner七、 总结中级实训第一天的自学报告 姓名:隐藏…

完整的Blender三维课程:素描到三维艺术的初学者
使用Blender创建3D艺术。初级课程 你会学到什么 使用Blender并理解它的界面 创建3D模型 创建您自己的材料 布料仿真、纹理和雕刻 第三种解释的相机法则 照相机景深 灯光设置 渲染 如何使用参考素材进行3D素描和建模?参考镜头也包括在内。 课程中包含所有章节场景文…

VirtualBox: Effective UID is not root
为什么80%的码农都做不了架构师?>>> 桌面上运行virtualbox出错: The virtual machine xp has terminated unexpectedly during startup with exit code 1 (0x1). Effective UID is not root(euid1000 egid482 uid1000 gid482)(rc-10) Please try reinst…

ironpython 教程_「ironpython」VS2017 IronPython做界面
本人开始做毕设了,但老师说工具要有界面,所以就开始找Python做界面的东西……之前做过C#的界面,脱拉拽很快界面就完成了,后来我查了下IronPython是用C#写的python解释器,也可以脱拉拽做界面,于是就开始尝试…

4、jQuery实现的全选、反选和不选功能
2019独角兽企业重金招聘Python工程师标准>>> 这个地址更权威:最好的选择:http://www.sucaihuo.com/js/10.html <html><head><title>TODO supply a title</title><meta charset"UTF-8"><meta name…

构建自己的PHP框架--构建缓存组件(1)
作为一个框架,我们还没有相应的缓存组件,下面我们就来构建我们的缓存组件。 先来定义一下接口,在 src 文件夹下创建 cache 文件夹,在cache文件夹下创建 CacheInterface.php 文件,其中定义 Cache 相应的接口,…

基于Golang的CLI 命令行程序开发
基于Golang的CLI 命令行程序开发 【阅读时间:约15分钟】一. CLI 命令行程序概述二. 系统环境&项目介绍&开发准备1.系统环境2.项目介绍3.开发准备三.具体程序设计及Golang代码实现1.selpg的程序结构2.导入的库3.sp_args结构体4.全局变量4.main函数5.process_…

Photoshop创造氛围照片合成视频教程含素材
数百个高分辨率工具和9个完整项目! 这个包包含开始创建史诗大气合成所需的一切-超过四个小时的基于项目的深入教程和超过400个合成工具。 大小解压后:10.7G 含课程素材文件 1920X1080 mp4 语言:英语中英文字幕(根据原英文字幕机…

java c++的区别_Java语言与C、C++之间的区别?
小伙伴你知道吗?Java是由C开发而来的,并且在当时一直被搁置。随着Java语言的崛起那么Java和C/C有什么不同和相同之处呢?通过上述我们知道那Java前身是C,并且保留了C的大部分内容,其编程方式也类似于C。但Java的句法更清…