一 微信发消息模块功能和易用测试点参考答案

1 微信发消息模块功能测试点:

1)  发正常文字信息;

2)  发正常语音信息;

3)  发正常视频信息;

4)  发正常的图片;

5)  发位置地图;

6)  发空信息;

7)  发超过字数限制(比如2000)个字以上;

8)  发超过60s的语音

9)  发超过视频时间限制的视频;

10)              发格式错误的图片,比如将图片格式修改为jpg1;

11)              发超过微信图片大小要求的图片;

12)              发超过视频大小要求的视频;

13)              发等于文字限制(比如2000)个文字的信息;

14)              发等于图片大小限制的图片;

15)              发等于60s的语音;

16)              发等于视频要求大小的视频;

2 发消息模块易用性测试点:

1)  检查微信此页面的布局是否合理;

2)  检查微信此页面是否有错别字;

3)  检查微信此页面功能是否符合APP设计标准;

4)  检查微信此功能是否实用;

二 发朋友圈模块功能和易用

1 发朋友圈模块功能测试点:

1)       发允许字数以内的纯文字内容;

2)       发允许字数和图片范围内的文字+图片内容;

3)       发允许字数和图片范围内的文字+图片内容+位置;

4)       发超过字数限制数量的纯文字内容;

5)       发超过字数和图片范围的文字+图片;

6)       发等于字数限制数量的文字;

7)       发等于字数和图片限制的文字和图片;

8)       发允许大小的视频文件;

9)       发超过要求的视频文件;

10)   发等于视频大小要求的视频文件;

11)   转发公众号中的文章;

12)   转发其他朋友的文章;

13)   转发其他朋友的文字和图片内容;

2 发朋友圈模块易用测试点:

1)  检查是否符合插入文字,插入图片的标准;

2)  检查此功能模块的菜单是否有错别字;

3)  检查此功能模块的菜单是否符号微信其他页面的风格;

4)  检查发朋友圈的所有功能是否实用;

5)  检查发朋友圈的所有插入方法是否一致;

 

 

 

知识汇总思维导图

#软件测试基础(2015级7&8班)# 指派了新任务。
补交作业栏(补充平时漏掉的作业)
请大家补交前写清楚任务标题例如:任务一答案如下: ……任务二答案如下:……

知识汇总

    软件测试基础这门课程整体分四大部分,第一部分测试背景知识;第二部分,测试技术;第三部分:测试工作流程相关主题;第四部分,专题测试;    在第一大部分中:就包括了测试是什么,为什么要进行测试,测试做什么?测试的原则,测试的内容;测试的误区;软件开发模型;软件测试模型;第二部分,测试技术相关,里面包括黑盒测试技术,白盒测试技术;这个是整个测试知识体系中的重点知识,无论以后做开发还是做测试,这些技术都需要明白,懂得这个思想,这些思想也可以应用在生活中,尤其面对选择时,可以使用等价类划分法去思考问题,所以作为知识本身讲,要深刻理解。    对于白盒测试技术,也同样,开发人员需要掌握,以提高自己的代码质量;作为测试人员讲,能够提高自己的测试技能;在白盒测试中又分为静态白盒测试和动态白盒测试;静态白盒测试,可以进行代码检查,比如桌面检查,代码走查和代码审查;结构分析,代码评估等等;动态白盒测试技术,包括六种逻辑覆盖,比如:语句覆盖,判定覆盖等等;每种覆盖,会检查到一部分逻辑,但也存在一部分检查不到的地方,条件组合覆盖和路径覆盖相对覆盖的比较全,但是花费的时间也比较多;所以在实际中用的时候也是酌情,要求安全性比较高的,需要用路径覆盖,条件组合覆盖;如果是安全性没那么高的,可以使用条件覆盖,判定覆盖这些覆盖方式;     第四部分:测试专题,兼容性测试,易用性测试,安全性测试;     在兼容性测试中,大家需要理解什么情况下需要考虑哪些兼容,比如平台(操作系统)的兼容性;应用软件的兼容性,需要考虑哪些,移动端的软件需要考虑哪些兼容;    易用性测试,分几个方面考虑,比如标准和规范;正确,一致等等;易用性测试用例从这些方面去考虑;     安全性测试,分两个角度,代码角度,外部攻击角度,其实核心在于代码,代码写的让别人没有插针的余地,需要下功夫;比如,最简单的密码能不能明文传输?不能;     然后,最好,我们讲解了质量相关的知识,其实质量相关的知识,应该放在这四大块中的第一块,背景知识中,为什么放在最好讲解,原因是,质量模型相对抽象,并且大家只有在测试之后,才会有质量的概念;我们提高编码能力也好,测试更全面也好,目的都是想要提高软件产品的质量。     第三部分:测试流程中:测试计划,测试环境搭建,测试用例的书写,实施测试,测试总结,测试评估;测试计划中,测试计划的基本结构;测试环境中;搭建测试环境的原则;注意事项等等;测试用例的书写:搞清楚为什么要书写测试用例,测试用例的格式,简化的,完整的都怎样写;实施测试中,第一轮测试,完整测试,之后进行回归测试,但是回归测试不代表不进行全部测试;验收测试:这也是测试过程中需要进行的,但他没有在测试流程中,只是用实施测试来代表,实施测试中包含初次测试,提交bug,回归测试,验收测试等等;甚至α,β测试,都包含在实施测试中,最终是测试总结和测试评估;围绕这个过程,每个过程我们需要知道做什么,怎样做?为什么做?做的过程中的注意事项等等。

任务四  知乎完善个人信息 用例参考答案

性别栏:

1 分别选择男和女,保存后查看结果是不是选择的男和女;

一句话介绍栏:

1不写任何内容

2 填入空格

3 填入10个汉字

4 填入10个字母

5 填入10个数字

6 填入边界值40个汉字

7 填入50个汉字

8 填入41个汉字

9 填入39个汉字

10 选择后,点击“取消”按钮

 居住地栏:

1 不输入任何文字

2 输入空格

3 分别输入汉字、字母、数字

4 输入边界个汉字

5 输入边界+1个汉字

6 输入边界-1个汉字

7 输入超过边界数量的汉字

8 选择后,点击“取消”按钮

所在行业栏:

1 不选择任何行业

2 抽取选择3个行业名称,保存后查看结果

3 选择后,点击“取消”按钮

职业经历栏:

1 两个文本框都填入空

2 两个文本框分别填入边界值以内的文字

3 两个文本框分别填入边界值以外的文字

4 两个文本框分别填入等于边界值的文字

5 两个文本框分别填入等于边界值+1个文字

6 两个文本框分别填入等于边界值-1个文字

7 第一个文本框填入合法信息,第二个文本框不填写任何内容

8 第一个文本框不填入任何内容,第二个文本框填入合法信息

9 填入信息后,点击取消

教育经历栏:

1 两个文本框都填入空

2 两个文本框分别填入边界值以内的文字

3 两个文本框分别填入边界值以外的文字

4 两个文本框分别填入等于边界值的文字

5 两个文本框分别填入等于边界值+1个文字

6 两个文本框分别填入等于边界值-1个文字

7 第一个文本框填入合法信息,第二个文本框不填写任何内容

8 第一个文本框不填入任何内容,第二个文本框填入合法信息

9 填入信息后,点击取消

个人简介栏:

1 不输入任何文字

2 输入空格

3 分别输入汉字、字母、数字

4 输入边界个汉字

5 输入边界+1个汉字

6 输入边界-1个汉字

7 输入超过边界数量的汉字

8 选择后,点击“取消”按钮

任务四:答案

定义一个函数,含有三个参数,year,month,day,

其中1920<=year<=2050,使用边界值分析法,对输入数据进行设计

答案:

Year边界值:1919,192019212049,2050,2051

Month边界值:1,122,11

Day 边界值:1,31,30,28,292

 

日取边界

<2000,6,1>

<2000,6,2>

<2000,6,30>

<2000,6,31>

月取边界

<2000,1,15>

<2000,2,15>

<2000,11,15>

<2000,12,15>

年取边界

<1919,6,15>

<1920,6,15>

<1921,6,15>

<2049,6,15>

年取边界

<2050,6,15>

 <2051,6,15>        

 

闰年日边界

<2000,2,28>

 <2000,2,29>

  

平年日边界

<2001,2,28>

  <2001,2,27>

 

 

 

安全函数

#软件测试基础(2015级7&8班)# 指派了新任务。
任务七 从功能测试和易用测试两个角度设计微信子功能测试用例
以宿舍为单位,每人选择微信的一种子功能,分别从功能和易用测试两个角度设计所选子功能测试用例。 提交方式:写明宿舍编号,选择功能名称,然后写功能角度用例和易用角度用例;每条用例必须换行。

知识点梳理图:

任务六  答案

1 满足哪些规则属于缺陷?

 软件未实现产品说明书要求的功能

 软件出现了产品说明书指明不应该出现的错误

 软件实现了产品说明书未提到的功能

 软件未实现产品说明书虽未明确提及但应该实现的目标

 软件难以理解,不易使用,运行缓慢或者--最终用户会认为不好

2 请按照缺陷报告要求的格式书写此缺陷报告:

   windows 8操作系统的记事本文件,输入''字,保存再次打开后,不是‘写’

操作步骤:

1点击“开始”->“程序” ->“附件” ->“记事本”打开记事本软件;

2 仅输入“写”字后,点击“文件”->“保存”;

3 在打开的“另存为”对话框中保存文件,退出(文件名、保存位置任意);

4 打开保存的文件,出现乱码,不是“写”字。

原因:

Windows平台下,使用系统的记事本以UTF-8编码格式存储了一个文本文件,但是由于Microsoft开发记事本的团队使用了一个非常怪异的行为来保存UTF-8编码的文件,它们自作聪明地在每个文件开头添加了0xefbbbf(十六进制)的字符,所以我们就会遇到一些保存后乱码的问题。

提醒:

如果测试编辑类功能,需要使用错误推测法,(或等价类划分法)设计不同编码格式显示问题。

3 判断缺陷严重性

 1)运行某金融软件,系统假死;   致命(Fatal

 2)某公司门户网站有中度病毒攻击   严重(Critical

 3)某论坛网站,当某条帖子的评论超过15条后会产生分页,需要用户点击“查看更多”来显示所有评论内容,当用户点击“查看更多”后,页面跳转到第1页评论内容;    Minor(小问题)

 4 简单描述缺陷生命周期,以及在每个阶段缺陷的状态。

      激活或打开(Active or Open

 新提的缺陷,确认“提交的缺陷”,问题还没有解决,等待处理。

 已修正 (Fixed or Resolved)

 已被开发人员检查、修复过的缺陷,已解决但还未被测试人员验证

 关闭或非激活(Closed or Inactive)

 测试人员验证后,确认缺陷不存在之后的状态。

 重新打开(Reopen)

 测试人员验证后,还依然存在的缺陷,等待开发人员进一步修复

 推迟(Deferred)

 这个软件缺陷可以在下一个版本中解决

 保留(on hold)

 由于技术原因或第三者软件的缺陷,开发人员不能修复的缺陷

 不能重现(Unable to reproduce)

 开发不能复现这个软件缺陷,需要测试人员检查缺陷复现的步骤。

 需要更多信息(Needmoreinfor)

 开发能复现这个软件缺陷,但开发人员需要一些信息,例如:缺陷的日志文件,图片等。

 重复(Duplicate

 这个软件缺陷已经被其他的软件测试人员发现。

 不是缺陷(Notabug

 这个问题不是软件缺陷

 需要修改软件规格说明书

 Spec modified

 由于软件规格说明书对软件设计的要求,软件开发人员无法修复这个软件缺陷,必须要修改软件规格说明书。

5 使用McCabe计算方式,计算如下代码复杂度(写出过程:程序流程图,控制流图,得出最终结果)。

 int foo(bool isOK)

{

 const int ZERO = 0;

int* pInt = NULL;

if (isOk)

{

pInt = &ZERO;

}

 return *pInt;

 }

程序流程图:

 

控制流图:

6 请根据以下程序片段,设计最少的测试用例实现条件覆盖

If((A>1)AND(B=0))

Then X=X/A

If((A=2)OR(X>1))

Then X=X+1

Printf("X=%d",x)

第一组数据:

A = 2

B = 0

X= >1的任何值))

第二组数据:

A= <=1 的任何值)

B = (非0的任何值)

X = <=1的任何值)

7 请列出关于一个印有文字的水杯,你能想到的测试用例

      

1)            功能:能不能盛水/盛饮料……;

2)            界面(外形):图案是不是清晰;文字描述是不是正确;形状上口大,下口小;

3)            性能:是不是抗摔;盛满水放7*24小时是不是仍然可以使用;

4)            安全:是不是烫手;材料是不是符合食品级别材料;

5)            易用:是不是方便使用;

8 写出对baidu首页搜索功能设计的测试用例

1)不填入任何内容,点击搜索;

2)输入空格,点击搜索;

3)输入单个字符(字母,数字,汉字),点击搜索;

4)输入单个单词/词语,点击搜索;

5)输入一句话(英文/中文),点击搜索;

6)输入图片(合理格式图片),点击搜索;

7)输入不合理格式图片,点击搜索;

8)输入文件后缀名(如.mp3)等,点击搜索;

9)输入边界值(38个汉字,39个汉字),点击搜索;

10)            输入100个汉字,点击搜索。

 

 

 

#软件测试基础(2015级7&8班)# 指派了新任务。
任务六 课前小测验
1 满足哪些规则属于缺陷? 2 请按照缺陷报告要求的格式书写此缺陷报告:    Windows 8操作系统的记事本文件,输入'写'字,保存再次打开后,不是‘写’ 3 判断缺陷严重性  1)运行某金融软件,系统假死;  2)某公司门户网站有中...

#软件测试基础(2015级7&8班)# 指派了新任务。
任务五 白盒测试练习题
分别使用动态白盒测试方法中的六种方法设计测试用例(写出用例数据即可),写出必要的分析步骤。 1 2 

代码审查清单 

常规项

  • 代码能够工作么?它有没有实现预期的功能,逻辑是否正确等。
  • 所有的代码是否简单易懂?
  • 代码符合你所遵循的编程规范么?这通常包括大括号的位置,变量名和函数名,行的长度,缩进,格式和注释。
  • 是否存在多余的或是重复的代码?
  • 代码是否尽可能的模块化了?
  • 是否有可以被替换的全局变量?
  • 是否有被注释掉的代码?
  • 循环是否设置了长度和正确的终止条件?
  • 是否有可以被库函数替代的代码?
  • 是否有可以删除的日志或调试代码?

安全

  • 所有的数据输入是否都进行了检查(检测正确的类型,长度,格式和范围)并且进行了编码?
  • 在哪里使用了第三方工具,返回的错误是否被捕获?
  • 输出的值是否进行了检查并且编码?
  • 无效的参数值是否能够处理?

文档

  • 是否有注释,并且描述了代码的意图?
  • 所有的函数都有注释吗?
  • 对非常规行为和边界情况处理是否有描述?
  • 第三方库的使用和函数是否有文档?
  • 数据结构和计量单位是否进行了解释?
  • 是否有未完成的代码?如果是的话,是不是应该移除,或者用合适的标记进行标记比如‘TODO’?

测试

  • 码是否可以测试?比如,不要添加太多的或是隐藏的依赖关系,不能够初始化对象,测试框架可以使用方法等。
  • 是否存在测试,它们是否可以被理解?比如,至少达到你满意的代码覆盖(code coverage)。
  • 单元测试是否真正的测试了代码是否可以完成预期的功能?
  • 是否检查了数组的“越界“错误?
  • 是否有可以被已经存在的API所替代的测试代码?

你同样需要把特定语言中有可能引起错误的问题添加到清单中。

这个清单故意没有详尽的列出所有可能会发生的错误。你不希望你的清单是这样的,太长了以至于从来没人会去用它。仅仅包含常见的问题会比较好。

优化你的清单

把使用清单作为你的起点,针对特定的使用案例,你需要对其进行优化。一个比较棒的方式就是让你的团队记录下那些在代码审查过程中临时发现的问题,有了这些数据,你就能够确定你的团队常犯的错误,然后你就可以量身定制一个审查清单。确保你删除了那些没有出现过的错误。(你也可以保留那些出现概率很小,但是非常关键的项目,比如安全相关的问题)。

得到认可并且保持更新

基本规则是,清单上的任何条目都必须明确,而且,如果可能的话,对于一些条目你可以对其进行二元判定。这样可以防止判断的不一致。和你的团队分享这份清单并且让他们认同你清单的内容是个好主意。同样的,要定期检查你的清单,以确保各条目仍然是有意义的。

有了一个好的清单,可以提高你在代码审查过程中发现的缺陷个数。这可以帮助你提高代码标准,避免质量参差不齐的代码审查。
PPT网盘链接:http://pan.baidu.com/s/1hswO8eg               提取码:9qw2

@All:如果交作业过程中,需要拍照上传,须纵向排照,否则横向拍照,上传,文字横向,看不清楚。

#软件测试基础(2015级7&8班)# 指派了新任务。
任务四 设计测试用例(等价类和边界值综合应用)
一  边界值分析法应用: 定义一个函数,含有三个参数,year,month,day, 其中1920<=year<=2050,使用边界值分析法,对输入数据进行设计。 二  常用控件测试方法...

2.4(边界值分析法)和2.5(常用控件测试方法)PPT,网盘地址点击这里

#软件测试基础(2015级7&8班)# 指派了新任务。
按等价类划分法对如下两个实例,进行用例分析和设计
要要求步骤: 1 1 写出每到题目划分的等价类(上课在黑板上写的); 222 对划分好的等价类进行编号; 333 写出每个编号下可以选取的数据。 题题目:  一:定义一个函数,含有三个参数,year...

没在学院交不了文档



@7班-许彩霞:任务提交文档错误,请尽快重交。

@全体成员  ,任务二今天晚上就截止了,请抓紧时间提交作业

#软件测试基础(2015级7&8班)# 指派了新任务。
根据Mymovie需求文档,书写此项目的测试计划
一、实验目标 1 理解影评项目的相关业务需求 2 掌握真实项目的测试计划制定 3 能够结合项目灵活设计测试方案 二、前提条件 1 阅读论坛需求相关文档,理解业务需求 2 掌握测试计划理论 测试计划即Test plan是计划阶段的测试文档,是指导测试过程的...

请大家在此目录下   \\10.7.1.4\super\教学管理\2016-2017(第一学期)课程\2015级软件测试基础,下载My movie项目需求 

软件测试中的诸多误区

想起这个题目,是因为最近遇到好几次关于这方面的讨论。发觉即便做过几年测试的老员工也或多或少有些这方面的困惑。当然一家之言,仅作抛砖引玉之谈。

一、测试就是保证软件无故障运行

对这个,我只想说这个观点只是出于测试人员美好愿望。再牛的测试员也不可能保证他所测的软件就能无故障运行。只能说在他所测的范围内,软件能按预先定义的需求运行。

这个误区的一个潜在问题是,秉承这一观点的测试人员可能更期望自己的测试对象能“顺利”运行,而不是尽力发现产品中的问题。

二、测试的环境就选用户的环境

我想说的是:不可能!好吧,也许对于一些具有固定用户,特别订制的特定环境下的软件产品,你很好找到用户的环境。不过对于大部分的软件产品而言,我想说即便你知道了用户甲的环境,你也不一定搞清楚用户乙的环境。即便同一个甲,可能他今天和明天的环境也不一定相同。那结果,你选择哪个环境作你的测试环境呢?

这个问题我想说的是用户的某些典型环境可以在测试中进行优先考虑,但真正的测试环境永远应该是那个你认为能更好暴露产品问题的环境。

三、测试自动化更为高效

说句心里话,我并不是反对这个观点,不过这观点是有商量余地的。自然,这里是拿自动化测试和手工测试作为对比的。也许自动化有诸多的优点,比如能够不厌其烦执行枯燥的动作;能够精确的定位时序动作;能够长时间工作;能够快速执行等等。不过自动化测试的缺点也是有的,比如需要开发成本;需要对产品行为的明晰定义。

说到这点,也就是说采取测试自动化是有条件的。并不是它就一定适应你的测试,何论高效。其实自动化测试更多的是应用在回归测试场合,更多的bug事实上是在手工测试中发现的。虽然这个事实不一定是你希望看到的:)

四、开发人员更适合做测试

测试圈内的一个共同认识是从事测试的人员技术上总比开发人员差,开发人员能更好的应用技术去测试;开发人员更能了解开发,所以更能了解问题的所在。

不过本人的经历而言,开发组转过来从事测试的同事绩效并不怎么理想。这个误区的问题在于过于简单的看待测试的技能需求。一般而言,测试工程师需要三维的技能:技术,业务领域知识和软技能。其中技术不仅仅是开发,还包括测试技术。从开发转作测试的人员,不一定具备这些能力,而且从某种程度,他们更专注在开发技能,可能更喜欢的是工具的实现和代码的审核。从整体上来说,开发人员的技能并一定就能完全胜任测试工作。

五、Bug越多测试越有效

估计很多的经理会有这个观点,很多同行估计也深受这个指标考核之苦。不过,如果打个不恰当的比方,说:GDP越高经济越有效。我想很多人也就明白个大概了。

Bug的出现有多方面的因素,并不一定需要多有效的测试。犹如上策伐谋一样,有效地测试最好将bug消灭在未成的时候。对产品报bug已经是到了最后的保障环节,成本已经相对变高——相对于需求分析和设计阶段。只有到了最后阶段,同样情况下才是有效地。不过这并不一定是好度量的。

软件测试中的诸多误区

想起这个题目,是因为最近遇到好几次关于这方面的讨论。发觉即便做过几年测试的老员工也或多或少有些这方面的困惑。当然一家之言,仅作抛砖引玉之谈。

一、测试就是保证软件无故障运行

对这个,我只想说这个观点只是出于测试人员美好愿望。再牛的测试员也不可能保证他所测的软件就能无故障运行。只能说在他所测的范围内,软件能按预先定义的需求运行。

这个误区的一个潜在问题是,秉承这一观点的测试人员可能更期望自己的测试对象能“顺利”运行,而不是尽力发现产品中的问题。

二、测试的环境就选用户的环境

我想说的是:不可能!好吧,也许对于一些具有固定用户,特别订制的特定环境下的软件产品,你很好找到用户的环境。不过对于大部分的软件产品而言,我想说即便你知道了用户甲的环境,你也不一定搞清楚用户乙的环境。即便同一个甲,可能他今天和明天的环境也不一定相同。那结果,你选择哪个环境作你的测试环境呢?

这个问题我想说的是用户的某些典型环境可以在测试中进行优先考虑,但真正的测试环境永远应该是那个你认为能更好暴露产品问题的环境。

三、测试自动化更为高效

说句心里话,我并不是反对这个观点,不过这观点是有商量余地的。自然,这里是拿自动化测试和手工测试作为对比的。也许自动化有诸多的优点,比如能够不厌其烦执行枯燥的动作;能够精确的定位时序动作;能够长时间工作;能够快速执行等等。不过自动化测试的缺点也是有的,比如需要开发成本;需要对产品行为的明晰定义。

说到这点,也就是说采取测试自动化是有条件的。并不是它就一定适应你的测试,何论高效。其实自动化测试更多的是应用在回归测试场合,更多的bug事实上是在手工测试中发现的。虽然这个事实不一定是你希望看到的:)

四、开发人员更适合做测试

测试圈内的一个共同认识是从事测试的人员技术上总比开发人员差,开发人员能更好的应用技术去测试;开发人员更能了解开发,所以更能了解问题的所在。

不过本人的经历而言,开发组转过来从事测试的同事绩效并不怎么理想。这个误区的问题在于过于简单的看待测试的技能需求。一般而言,测试工程师需要三维的技能:技术,业务领域知识和软技能。其中技术不仅仅是开发,还包括测试技术。从开发转作测试的人员,不一定具备这些能力,而且从某种程度,他们更专注在开发技能,可能更喜欢的是工具的实现和代码的审核。从整体上来说,开发人员的技能并一定就能完全胜任测试工作。

五、Bug越多测试越有效

估计很多的经理会有这个观点,很多同行估计也深受这个指标考核之苦。不过,如果打个不恰当的比方,说:GDP越高经济越有效。我想很多人也就明白个大概了。

Bug的出现有多方面的因素,并不一定需要多有效的测试。犹如上策伐谋一样,有效地测试最好将bug消灭在未成的时候。对产品报bug已经是到了最后的保障环节,成本已经相对变高——相对于需求分析和设计阶段。只有到了最后阶段,同样情况下才是有效地。不过这并不一定是好度量的。

每个开发者都应该懂一点单元测试


一、什么是单元测试
为了测试某个类中的某一个方法能否正常工作,而写的测试代码。
单元的定义:代码中可度量的最小单元(函数/方法);
是否正常工作:不同的输入对应的输出是否与预期一致。
二、单元测试有必要吗?
1 对是否有必要写单元测试的疑惑
没有价值:不做单元测试一样地开发,并没有什么问题(解释:);
浪费时间:写单元测试需要大量的时间,还不如写具体的实现,具体的实现能看到明显的效果,但单元测试可能耽误正常的迭代进度;
无法测试:比如无返回值的方法、UI等;
2 不写单元测试会存在的一些问题:
要有足够的耐心:改一个参数,需要重新运行一遍程序;
没有足够的自信:每次提测和发布,心惊胆战,对自己写的程序没有信心;
要有足够的时间:必须要等到测试发现bug后才去改善;
bug太多,程序很难稳定:可以看下你自己开发的应用,如果有做异常采集,上报的大多数异常问题,都是因为程序没有做好容错导致的,比如空指针、被除数为0、数组越界等;
3 单元测试能够解决的问题
效率:如果没有单元测试就必须把程序运行起来测试;运行一次单元测试,最多几分钟,cover得比较全面,相比于执行程序,效率高很多很多;
质量:对于每个最小单元,针对不同输入对应的输出有与预期做对比,能够减少因为参数导致的异常问题,同时提测和发布版本的时候,有信心;
提升设计能力:为了每个单元都可测,需要将每个方法拆得尽量独立,如果不拆得足够独立,就无法测试,间接可以提高程序设计能力;
代码重用:跑过单元测试的代码,稳定性能够得到保证,可以在其它项目或者项目重构时重复利用;
缩短测试周期:程序自测(开发人员写单元测试、手动跑基本功能、跑monkey都属于自测)可以提高产品提测的质量,避免返工;同时核心功能的稳定有助于缩短黑盒测试的周期。
三、哪些可以做单元测试?
任何方法都可以做单元测试;
从必要性来讲,针对UI相关的做单元测试必要性不大,并且很多东西需要主观判断;所以只针对Model和Control层做测试;
私有方法同样可以测试(反射,或者在测试时改为public方法),但非public方法是这个类的实现细节,其它类并不关心,不用测试;
四、关于单元测试的一些概念
1 分类
按测试内容分:
功能测试:和UI无关,测试IO操作、算法、流程等;
UI测试:测试UI交互逻辑,比如点击、登陆等;
按是否依赖设备分
不依赖Android设备,只需要运行在JVM上的;→真正的单元测试,执行快,效率高;
依赖Android设备(模拟器/真机),需要程序运行时状态信息的,比如获取磁盘空间、四大组件的上下文信息、异步任务、消息传递等;→其实是集成测试,需要运行整个程序,执行慢,效率低;
2 测试框架
如果没有框架该如何做单元测试
自己写程序进行逻辑判断(麻烦、加入测试程序有bug怎么办?);
在console中观察测试结果;
测试框架能够提高测试效率
JUnit、Instrumentation test、Espresso、UI Automator、Robolectric、Appium、Robotium
JUnit:能够直接在PC上执行;
AndroidTest:需要依赖Android设备;
Robolectric:在不需要依赖Android环境的前提下,实现在PC上直接运行Android的单元测试;
Robotium:第三方UI测试框架;
Espresso:Google推出的UI测试框架;
UI Automator:流程的UI测试框架;
3 覆盖率
衡量单元测试质量,通过覆盖率测试,可以明确知道哪部分代码已经被单元测试覆盖到,哪部分没有进行单元测试;常用的单元测试插件有Emma、JaCoCo;
4 JUnit框架中的常用方法
setUp/@Before:在每个单元测试方法执行之前调用;
tearDown/@After:在每个单元测试方法执行后调用;
setUpBeforeClass/@BeforeClass:在每个单元测试类运行前调用;
tearDownAfterClass/@AfterClass:在每个单元测试类运行完成后调用。
Junit3中每个测试方法必须以test打头,Junit4中增加了注解,对方法名没有要求,@Test就可以。
5 一个单元测试的流程
setUp:设置前提条件,比如初始化;
执行动作:调用被测方法,并得到返回结果;
验证结果:验证获取的结果和预期是否一致;
6 关于Mock
在写单元测试的过程中,我们可能会发现需要和系统内的某个模块或系统外某个实体交互,而这些模块或实体在您做单元测试的时候可能并不存在,比如您遇到了数据库、遇到了驱动程序等。这时开发人员就需要使用mock技术来完成单元测试。
mock就是创建一个类的虚假的对象,在测试环境中,用来替换掉真实的对象,以达到两个目的:
验证这个对象的某些方法的调用情况,调用了多少次,参数是什么等等;
指定这个对象的某些方法的行为,返回特定的值,或者是执行特定的动作。
要使用mock技术,就需要使用mock框架,Mockito和Jmockit是android平台两个常用的mock框架,其中Mockito不能mock static method和final class、final method,但Jmockit可以。
7 依赖注入在单元测试中的使用
上文中提到的Mock技术就是创建一个类的虚假的对象,在测试环境中用来替换掉真实的对象,但如何在测试环境下,将某个类替换成mock的对象就需要使用到依赖注入了,他的基本理念是,某一个类(比如说DataActivity),用到的内部对象(比如说DataModel)的创建过程不在DataActivity内部去new,而是由外部去创建好DataModel的实例,然后通过某种方式set给DataActivity。这种模式应用是非常广泛的,尤其是在测试的时候。常见的依赖注入框架有:Roboguice、Dagger、Dagger2。
在实际写单元测试的过程中,mock技术会经常用到,所有非常有必要熟悉其中一种依赖注入框架,关于依赖注入的详细解释可以参见公共技术点之依赖注入。
五、单元测试集成到Jenkins
Jenkins上不需要任何改动,执行现有的gradle命令会自动执行单元测试,测试不通过会报编译错误;
六、说明
不要指望对某个方法的单元测试一次能够写得足够完美,单元测试也是需要持续迭代的(比如入参考虑得不全面、单元测试粒度没有足够细等);
并不是所有针对源码级别写的测试代码都叫单元测试,针对具体某一个方法的测试叫单元测试,涉及到UI层面、必须要运行程序才能跑的测试叫集成测试,比如很多基于android平台的第三方UI测试框架;
test和androidTest文件夹的区别:如果你是用Android Studio做开发,在创建工程的时候,src文件夹下会同时生成三个文件夹main、test、androidTest,其中test和androidTest是专门针对源码级别的白盒测试的,test文件夹用于写不依赖设备环境的单元测试,即直接在PC上即可运行的测试,特点是测试效率高;androidTest文件夹用于写需要在设备上才能运行的测试,比如测试依赖android API和设备环境的时候(context、IO操作、UI测试等),就需要在这个文件夹下面写单元测试了,其特点是必须要编译生成APK后才能测试,效率低;
测试驱动开发(TDD)的这种软件开发方法提倡先写测试程序,再才编码实现具体的功能;
编写需求文档参考资料下载地址:http://pan.baidu.com/s/1skJWsoP       提取码:  xfc2

了解敏捷开发的资料,参见博客:http://blog.csdn.net/myscrum/article/details/4313181

软件测试的十二个误区


软件测试是软件开发中非常重要的部分,甚至可以说,软件开发,一半是开发,一半是测试。软件测试过程中会遇到一些误区,希望能给大家指点迷津。

软件测试的十二个误区大体总结如下:

1) 测试人员不需要了解软件开发的知识:

这个很要命的,我们谈到软件测试人员未来的发展方向大致有:自动化测试,性能测试,测试管理,项目经理。这其中自动化测试和性能测试包括项目管理,都会要求对软件开发有深入的理解,如何能设计一个好的自动化框架,好的性能测试用例,如何管理一个开发团队,这都需要我们在软件开发方面有所掌握。不单要掌握,而且要精通。此其一。

其二:如果不了解开发知识,测试人员很容易被开发人员牵着鼻子走,因为开发人员随便一忽悠,你如果不了解个中奥妙,你一个字也说不上来。(以前我们讨论 Cookie和Session,由于GoAhead不支持Session,只能用Cookie来控制,差点别开发人员忽悠了)

2) 软件测试很简单:

如果你这么想,那么请别去做测试,如果你做了,你也做不长久。以前面试一位小伙子,做了3年测试,问他测试都怎么做的?答不上来,原来他测的都是很简单的小软件,根本就没有系统地去学习过测试,无语。

3) 测试就是为了找到BUG

很多人最初都是这样的看法,千万要小心。如果你只是为了找到BUG,那么BUG会成天缠着你。

4) 测试人员和开发人员从来都是死对头:

我以前发起过一个倡议:我们讨论的时候不要用他们(开发人员)和我们(测试人员),而是统一用咱们(开发人员和测试人员本来就是一起的)。如果测试人员能与开发人员成为朋友,你会发现,生活是多么美好。

5) 自动化测试太难:

有的人一进公司就想做自动化,觉得它有难度,有挑战。我说你如果做不好手工测试,你同样做不好自动化,手工测试才是基础。而另外还有一部分人一说到自动化便望而生畏,认为这个东西太难了,不想碰(特别是很多女生,就有这个心理)。其实大可不必这样想,自动化测试工具它只是一个工具而已,它跟WORD这样的工具没有任何区别。

6) 手工测试太没挑战:

什么都不说了,能把它做好的人没几个。

7) 大量的重复性的工作很乏味:

于是大家学得测试这份工作不好玩儿,特别一些男生,特别一些开发人员,从来都瞧不起做测试的,觉得这玩意儿太没劲。我想说的是,要掌握方法,要学会创新,任何东西都有它的特点,你如果总觉得成天在做重复性的工作,那么请静下心来想想,怎么能让它不重复(事情本身是死的,人是活的)。

8) 白盒测试是开发人员干的事:

一个合格的测试人员必须掌握白盒测试,理解其中的原理。不管什么样的测试,都必须要有测试人员的思维才能做好。

9) 女生适合做测试:

不管适合不适合吧,反正我以前所在的公司有5个Team Leader,3个Test Manager,其中只有两个是男生(加上我),这是现实。但是做自动化测试的,全是4个男生,这也是现实。不太想加以评论。只想说,女生未必适合做测试,男生同样能把测试做好,且做得更加专业。

10) 测试就是给开发擦屁股的:

如果这样想,那么请每天多准备些手纸。测试人员永远要站在客户的角度来想问题,很显然,客户是从来不会给谁擦屁股的,相反,是客户在驱动着软件的进展与成型。测试人员就应该扮演这样的角色,在大部分时候,要驱动开发人员完成软件的功能,驱动他们做改变。

11) 我做开发可能不行,做测试吧:

这个观点特别适应于应届毕业生,在以前面试的过程中,有一部分人就是觉得我代码写不好,所以入行做测试,还有一部分人稍微明白一点的,是觉得自己在开发方面没什么优势,主动给自己定位做测试工作。其实测试要掌握的技能远比开发多得多,至少面要广得多,要做一个好的测试人员,远比做一个开发人员难得多。

12) 功能性测试掩盖了可用性测试的必要

测试人员甚至我们的设计人员,开发人员都不太注重可用性(usability)方面的设计和测试。

我们往往只在意功能性或者性能方面的测试,而忽略了用户体验,即使谈不上用户体验,哪怕是方便使用也行,这些方面往往从软件需求,设计一开始就没怎么考虑。到后来,用户使用的时候便是边用边骂娘。(我常举的例子是:咱们买手机的时候,手机功能一切正常,但偏偏盖子上有条划痕,我相信大家都会要求重新换一台,就这意思)

有则改之,无则加勉,希望大家在进入软件测试这一行以前,能对测试有一个更深入的认识。时间仓促,随便写写,大家多提观点。

软件缺陷导致严重后果的典型案例

用户为了保证自己业务的顺利完成,当然希望选用优质的软件。质量不佳的软件产品不仅会使开发商的维护费用和用户的使用成本大幅度增加,还可能产生其他的责任风险,造成公司信誉下降。一些关键的应用领域(例如银行、证券交易、军事等)如果质量有问题,还可能造成灾难性的后果。

现在人们已经逐步认识到是软件中存在的错误导致了软件开发在成本、进度和质量上的失控。 由于软件是由人来完成的,所以它不可能十全十美,虽然不可能完全杜绝软件中的错误,但是可以通过软件测试等手段使程序中的错误数量尽可能少,密度尽可能小。

接下来看看成功的软件测试带来的好处和不完整的软件测试带来的教训。

IENetscape

IE 4.0的开发期间,微软为了打败Netscape而汇集了一流的开发人员和测试人员。测试人员搭建起测试环境,让IE在数台计算机上持续运行一个星期,而且要保障IE在几秒钟以内可以访问数千个网站,在无数次的试验以后,测试人员证明了IE在多次运行以后依然可以保障它的运行速度。而且,为了快速完成IE 4.0的开发,测试人员每天都要对新版本进行测试,不仅要发现问题,而且要找到问题是哪一行代码造成的,让开发人员专心于代码的编写和修改,最终IE取得了很大的成功。

360存在严重后果缺陷导致系统崩溃

电脑中了木马,使用360安全卫士查出一个名为Backdoor/Win32.Agent.cgg的木马,文件位置为C:\Windows\system32\shdocvw.dll。进行清理后看不到Windows任务栏和桌面图标,根本进不去桌面,手工运行Explorer.exe也是一闪就关,后来查明是由于360在处理此木马时存在严重缺陷。360安全卫士只是简单的删除了木马文件,没有进行相关的善后处理工作,致使系统关键进程Explorer.exe无法加载。

20092月份GoogleGmail故障

20092月份GoogleGmail故障,Gmail用户几小时不能访问邮箱,应该算是最近因软件故障而受到广泛关注的事件。据Google后称,那次故障是因数据中心之间的负载均衡软件的Bug引发的。

360问题和Gmail故障还仅是导致用户不能正常使用电脑或几个小时内无法访问邮箱,并没有造成伤亡。当然了,对某些用户来讲,是非常不便。

但看了下面的一个例子您会发现,360Gmail的问题真是“小巫见大巫”了。

2011 年温州7.23 动车事故

2011723203005秒,甬温线浙江省温州市境内,由北京南站开往福州站的D301次列车与杭州站开往福州南站的D3115次列车发生动车组列车追尾事故,造成40人死亡、172人受伤,中断行车32小时35分,直接经济损失19371.65万元。

上海铁路局局长安路生28日说,根据初步掌握的情况分析,“7·23”动车事故是由于温州南站信号设备在设计上存在严重缺陷,遭雷击发生故障后,导致本应显示为红灯的区间信号机错误显示为绿灯。

● 致命的辐射治疗

辐射剂量超标的事故发生在2000年的巴拿马城(巴拿马首都)。从美国Multidata公司引入的治疗规划软件,其(辐射剂量的)预设值有误。有些患者接受了超标剂量的治疗,至少有5人死亡。后续几年中,又有21人死亡,但很难确定这21人中到底有多少人是死于本身的癌症,还是辐射治疗剂量超标引发的不良后果。

● 消失在太空

在制造其火星气候轨道探测器时,一个NASA的工程小组使用的是英制单位,而不是预定的公制单位。这会造成探测器的推进器无法正常运作。正是因为这个 Bug1999年探测器从距离火星表面130英尺的高度垂直坠毁。此项工程成本耗费3.27亿美元,这还不包括损失的时间(该探测器从发射到抵达火星将近一年时间。)

● 阿丽亚娜5型火箭的杯具处女秀

199664日,阿丽亚娜5型运载火箭的首航,原计划将运送4颗太阳风观察卫星到预定轨道,但因软件引发的问题导致火箭在发射39秒后偏轨,从而激活了火箭的自我摧毁装置。阿丽亚娜5型火箭和其他卫星在瞬间灰飞烟灭。

后来查明的事故原因是:代码重用。阿5型的发射系统代码直接重用了阿4型的相应代码,而阿4型的飞行条件和阿5型的飞行条件截然不同。此次事故损失3.7亿美元。

● 英特尔奔腾芯片缺陷

如果在计算机的“计算器”中输入以下算式:

419583/3145727X3145727-4195835

结果显示为零。而在1994年,结果可能为其他答案,这就是英特尔(Intel)奔腾(PentumnCPU芯片所带来的一个浮点触发缺陷。英特尔为此付出了4亿多美元的代价。

● 一触即发的第三次世界大战

1980年,北美防空联合司令部曾报告称美国遭受导弹袭击。后来证实,这是反馈系统的电路故障问题,但反馈系统软件没有考虑故障问题引发的误报。

1983年,苏联卫星报告有美国导弹入侵,但主管官员的直觉告诉他这是误报。后来事实证明的确是误报。

幸亏这些误报没有激活“核按钮”。在上述两个案例中,如果对方真的发起反击,核战争将全面爆发,后果不堪设想。

通过以上的例子,可以看出软件发生错误时对人类生活所造成的各种影响,有的甚至会带来灾难性的后果。软件测试可以使这种风险降低,它在一定程度上解放了程序员,使他们能够更专心于解决程序的算法效率。同时它也减轻了售后服务人员的压力,交到他们手里的程序再也不是那些“一触即死机”的定时炸弹,而是经过严格检验的完整产品。同时,软件测试的发展对程序的外形、结构、输入和输出的规约和标准化提供了参考,并推动了软件工程的发展。