4th-结对编程2
0x00 Coding
合作伙伴:庞伊凡(201421123011)、赵娅汀(201421123012)
0x01 题目描述
上一周大家为四则运算程序设计了2-3个新功能,本次在隔了一周之后,我们循序渐进地进阶。
0x02 需求分析
把计算模块提取出来,单独创建一个类。针对提取出来的计算类的接口函数做单元测试。
单元测试的意义:
- 减少bug
一个机器,由各种细小的零件组成,如果其中某件零件坏了,机器运行故障。必须保证每个零件都按设计图要求的规格,机器才能正常运行。一个可单元测试的工程,会把业务、功能分割成规模更小、有独立的逻辑部件,称为单元。单元测试的目标,就是保证各个单元的逻辑正确性。单元测试保障工程各个“零件”按“规格”(需求)执行,从而保证整个“机器”(项目)运行正确,最大限度减少bug。
- 快速定位bug,减少调试时间
如果程序有bug,我们运行一次全部单元测试,找到不通过的测试,可以很快地定位对应的执行代码。修复代码后,运行对应的单元测试;如还不通过,继续修改,运行测试.....直到测试通过。
对于Android项目,要测试某个功能点,不用单元测试的话,必须运行在真机、模拟器上,慢慢debug找到问题点。运行程序到真机,快则半分钟,慢则几分钟。junit只需在本地运行即可,就几秒的事(robolectric需要十几秒)。有时,写那个功能模块的员工已离职,APP运行出错(逻辑错误,非crash or exception),你根本就不知道调试哪个类。如果离职的员工之前写了单元测试,运行一下立马就找到问题点了。单元测试大大减少调试时间,从而达到节约时间成本的效果。
- 提高代码质量
由于每个单元有独立的逻辑,做单元测试时需要隔离外部依赖,确保这些依赖不影响验证逻辑。因为要把各种依赖分离,单元测试会促进工程进行组件拆分,整理工程依赖关系,更大程度减少代码耦合。这样写出来的代码,更好维护,更好扩展,从而提高代码质量。
- 放心重构
重构,每个开发者都会经历,重构后把代码改坏了的情况并不少见。以往,写完一个框架,运行APP,没什么问题,完事。由于最初的框架并不是你写的,可谓牵一发动全身,你改1个方法导致整个框架运行失败....
如果你有单元测试,情况大不相同。写完一个类,把单元测试写了,确保这个类逻辑正确;写第二个类,单元测试.....写100个类,道理一样,每个类做到第一点“保证逻辑正确性”,100个类拼在一起肯定不出问题。你大可以放心一边重构,一边运行APP;而不是整体重构完,提心跳胆地run。
测试内容:
加减乘除功能测试
输入非法字符测试
除0错误测试
0x03 测试框架设计&模拟测试数据
- 加减乘除测试
def test_add(self): #测试加法
que=[[2,'+',4],[3.0,'+',5.0],[10,'+',4],[10,'+',2.0],[25,'+',2.0]]
ans=['6','8.0','14','12.0','27.0']
for i in range(len(que)):
test=calc.operate(que[i][0],que[i][1],que[i][2])
self.assertEqual(test, ans[i])
def test_sub(self): #测试减法
que=[[2,'-',4],[3.0,'-',5.0],[10,'-',4],[10,'-',2.0],[25,'-',2.0]]
ans=['-2','-2.0','6','8.0','23.0']
for i in range(len(que)):
test=calc.operate(que[i][0],que[i][1],que[i][2])
self.assertEqual(test, ans[i])
def test_mult(self): #测试乘法
que=[[2,'*',4],[3.0,'*',5.0],[10,'*',4],[10,'*',2.0],[25,'*',2.0]]
ans=['8','15.0','40','20.0','50.0']
for i in range(len(que)):
test=calc.operate(que[i][0],que[i][1],que[i][2])
self.assertEqual(test, ans[i])
def test_div(self): #测试除法
que=[[2,'/',4],[3.0,'/',5.0],[10,'/',4],[10,'/',2.0],[25,'/',2.0]]
ans=['0','0.6','2','5.0','12.5']
for i in range(len(que)):
test=calc.operate(que[i][0],que[i][1],que[i][2])
self.assertEqual(test, ans[i])
def test_multi(self): #测试多位数
que=['2*3+5-8','3-2/8.0+1','12/4-2.7+5','8*3-6-1.2']
ans=['3','3.75','5.3','16.8']
for i in range(len(que)):
test=calc.operate(que[i])
self.assertEqual(test, ans[i])
将加减乘除分别写在add、sub、mult、div、multi 五个函数里,每个函数内的que列表为测试数据,ans列表为应有的测试结果。
若测试加减乘除功能后得出的结果等于ans列表中的结果,则通过测试,反之则不通过。
- 输入非法字符测试: 输入非法字符,若反馈为'syntax_error',则通过测试。
def test_oper_more_one(self): #测试非法输入
que=[[2,'++',4],[3.0,'---',5.0],[10,'**',4],[10,'////',2.0],[25,'//',2.0]]
ans='syntax_error'
for i in range(len(que)):
test=calc.operate(que[i][0],que[i][1],que[i][2])
self.assertEqual(test, ans)
- 除0错误测试: 进行除法计算时,若除数为0,则反馈为'zero_error',通过测试。
def test_zero(self): #测试除数为0情况
que=[[2,'/',0],[3.0,'/',0],[10,'/',0]]
ans='zero_error'
for i in range(len(que)):
test=calc.operate(que[i][0],que[i][1],que[i][2])
self.assertEqual(test, ans)
- 单元测试结果展示

- 怎么告诉函数的调用者 “你错了”? 把返回的字符串定义为 “-1” 来表示?
语法错误:返回syntax_error
除零错误:返回zero_error
其它错误:返回error
- 那么如果真的计算结果是 “-1” 又怎么处理呢?
因为没有用-1 所以不会出现这个问题的错误。
0x04 覆盖率测试
本次代码使用python编程,选择了coverage插件进行测试
1. 安装: easy_install coverage
2.测试: coverage run test_operation.py
3.结果展示: coverage report

0x05 结对过程
1. 结对编程感受
这是我们第二次使用结对编程的合作模式,在我们还没有接触结对编程的时候,我们都认为两个人一起做一个项目,就应该是一个人负责实现这几种功能,另一个人负责实现另外几种功能,最后再将这些功能合并到一起,就形成我们俩一起合作完成的项目。在我做领航员的时候,队友敲代码,我会指点她哪里可能出错,用什么方法实现比较好。在队友做领航员的时候,她能很好地提醒我怎么正确地调用函数。这样是极好的!
2. 测试过程遇到的问题以及解决方案
- 在获取两个数值和符号的过程中,一直在报错
TypeError: operate() takes exactly 3 arguments (1 given),后来更换了函数调用方法 完成了结果。 - 比较的过程中,需要保持数据类型相同。以前吃过类似的亏,所以解决起来相对比较快速。
3. 评价队友---给队友一个汉堡包
- 先给一片面包:在结对编程的时候发现我的队友还是特别认真的,遇到要实现的功能实现不了,就会一直查资料,百度等等,一定要把它做出来为止才算完。
- 再给一块肉:队友的基础不是很好,一些逻辑过程需要反复交流才能达到想要的效果
- 再给一个面包:总体来说,队友的表现还是非常好的,非常负责,非常认真,我希望她能以后对编程产生兴趣,更有感觉。
4. 合作照片

0x06 PSP

4th-结对编程2的更多相关文章
- 结对编程--基于android平台的黄金点游戏
游戏内容: 阿超的课都是下午两点钟,这时班上不少的同学都昏昏欲睡,为了让大家兴奋起来,阿超让同学玩一个叫“黄金点”的游戏: N个同学(N通常大于10),每人写一个0~100之间的有理数 (不包括0或1 ...
- 结对编程-地铁续(有种上个学期OO的既视感)
我们组比较特殊..三人结对 github:https://github.com/qingchanghan/WPFUI_Metro po一张照片: 石浩然,韩青长.陈彦吉 (台式机真的很高端,分屏贼帅) ...
- 结对编程项目——四则运算vs版
结对编程项目--四则运算vs版 1)小伙伴信息: 学号:130201238 赵莹 博客地址:点我进入 小伙伴的博客 2)实现的功能: 实现带有用户界面的四则运算:将原只能在 ...
- 关于软件工程结对编程作业 PairProject : Elevator Scheduler(电梯调度算法的实现与测试)的总结
1)结对编程队友 1106xxxx 张扬 1106xxxx 杨军 其中,此项目的编程实现主要由前者完成. 2)关于结对编程 结对编程的优点: 最直接的一点:在结对编程中,由于有另一个人在你身边和你配合 ...
- 结对编程—黄金点游戏WinForm单机版
本小游戏场景来自邹欣老师的<移山之道>一书: "阿超的课都是下午两点钟,这时班上不少的同学都昏昏欲睡,为了让大家兴奋起来,阿超让同学玩一个叫"黄金点"的游戏: ...
- Week4 结对编程
1.照片 1.1 结对编程参与者:李文涛.黎柏文 1.2 展示照片 2.结对编程的优点&缺点 2.1 优点 2.1.1.两人分工合作,减少了工作量 2.1.2.结对编程的伙伴往往能提供不同 ...
- 结对编程——关于Fault、Error、Failure程序设计
一.问题描述: 构造程序,分别是: •不能触发Fault •触发Fault,但是不能触发Error •触发Error,但是不能产生Fai ...
- GUI、模块化与结对编程(homework-03)
摘要: 在本次作业博客里,我将主要阐述作业3的收获.作业3表面是将之前的程序转换为图形界面(之前程序见http://www.cnblogs.com/shone/p/3348372.html),然而本质 ...
- BJDP结对编程活动
7月21日参与了 BJDP北京的活动 在北京首次参与能够参与动手编程活动,感觉挺不错的. 本次活动共有三项内容 1. 金锐分享单元测试的Mocking技术,20 mins 2. 伍 ...
- 敏捷开发松结对编程系列:L型代码结构案例StatusFiltersDropdownList(中)
这是松结对编程的第22篇(专栏目录). 接前文 业务代码 比较长,基本上就是看被注释隔开的三大段,先显示状态群筛选链接,然后是单个状态筛选,然后是显示下拉框的当前选中项,最后显示下拉框. public ...
随机推荐
- NYOJ 71 独木舟上的旅行(贪心)
独木舟上的旅行 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 进行一次独木舟的旅行活动,独木舟可以在港口租到,并且之间没有区别.一条独木舟最多只能乘坐两个人,且乘客 ...
- 部署Node.js项目(CentOS)
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,用来方便地搭建快速的易于扩展的网络应用.Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又 ...
- Windows 程序注册成服务的方法
Windows 程序注册成服务的方法 将windows 程序注册成服务这个是很多后台程序需要实现的功能,注册成服务后,你的程序就可以像windows 服务一样随系统启动,并且隐藏你的控制台界面.下面介 ...
- ubuntu14.04 64位安装H3C iNode客户端
环境: OS:ubuntu14.04LTS 64位 iNode: iNode2.40-R0162 for linux(iNode只有32位的,而且是很久以前的版本) 安装方法: 第一种: 检查本机是6 ...
- 立即表达式的多种写法与注意点以及in操作符的作用
立即表达式,在javascript中非常常见, 采用立即表达式可以形成一个局部作用域, 常配合闭包实现模块化编程等其他用途,接下来我们看看,在大多数的框架中,立即表达式都有哪些写法,以及需要注意的点, ...
- Weex入门指南
背景 由于公司项目需要,需求变化频繁,计划总改不上变化,由于app更新版本周期长,不能很好应对这种变化,正在此前提下热修复和热更新技术也有了发展的空间,不管热修复还是热更新,都是对app内容或者逻辑的 ...
- select、poll、epoll简介
epoll跟select都能提供多路I/O复用的解决方案.在现在的Linux内核里有都能够支持,其中epoll是Linux所特有,而select则应该是POSIX所规定,一般操作系统均有实现 sele ...
- EF5.0默认不支持DB First了?
面试官说貌似都是Code First了,需确认下
- cycript
cycript是大神saurik开发的一个非常强大的工具,可以让开发者在命令行下和应用交互,在运行时查看和修改应用.它确实可以帮助你破解一些应用,但我觉得这个工具主要还是用来学习其他应用的设计(主要是 ...
- 关于Java String 类型转换时null的问题
开发中经常遇到从集合类List.Map中取出数据转换为String的问题,这里如果处理不好,经常会遇到空指针异常java.lang.NullPointerException,在此总结一下常用转换为St ...