之前的一次个人总结和一次单元测试入门学习是开启软件工程课程的前奏曲,也是热身,现在大家对于这门课程也有了初步的了解和认识,这次要开始真正的演奏了,要从头到尾完全靠自己的能力来解决一个问题,进行实战演练了。以下就是这次实战的全过程。


阅读目录

题目及要求

设计思路

PSP表格

实现过程

覆盖标准

流程图及测试用例

总结与体会


题目及要求

由于本次作业题为二选一,我选择了题目一。

题目一:最大连续子数组和(最大子段和)

问题: 给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。当所给的整数均为负数时定义子段和为0,依此定义,所求的最优值为: Max{0,a[i]+a[i+1]+…+a[j]},1<=i<=j<=n
例如,当(a[1],a[2],a[3],a[4],a[5],a[6])=(-2,11,-4,13,-5,-2)时,最大子段和为20。

要求:

(1) 请从上述两个题目中根据个人实力任选一题,要求写出可运行的完整代码提交至GitHub或者Coding.net系统中,并将代码地址附到博客内。

(2) 请从语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖五个覆盖标准中(条件组合覆盖难度较大,鼓励尝试,但请谨慎选择),任选一个标准设计测试用例。

(3) 请利用自动测试工具对程序进行测试。

(4) 请将程序运行结果和自动测试分析结果截图附到博客中。


设计思路

看完这个题目之后,觉得特别的眼熟,记得以前学习算法与数据结构的时候对这个题就有一些印象,但是当时没有仔细做。题目要求不仅要编出可运行的程序,提交到Coding.net系统中,还要从语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖这五个覆盖标准中选择一个标准来设计测试用例,并用自动测试工具检测,这里结合了写上一篇博客时学到的单元测试的方法。

本题我的解题思路是:
只管当前连续子数组的和。设置一个thissum变量来计算当前连续子数组的和,再用一个sum变量来与当前变量thissum相比较,如果thissum>sum,就将sum赋值为thissum。如果不小于,那么就要判断thissum是否小于0,如果是,那么无论后面再加上什么数字都会让子数组变得更小,所以就要抛弃当前子数组,重新开始计算子数组的值。

另外,题目中有说明如果所有整数都为负数则定义子段和为0,在我设计的这个方法中就不需要去额外判断每一个值都是否为负数,因为在最开始就定义了sum为0,只有当前thissum>0时sum值才会改变,全负数的时候sum值是不会改变的。


PSP2.1表格

PSP2.1 PSP阶段 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 10 15
· Estimate · 估计这个任务需要多少时间 10 15
Development 开发 295 370
· Analysis · 需求分析 (包括学习新技术) 45 50
· Design Spec · 生成设计文档 10 15
· Design Review · 设计复审 10 10
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 10 10
· Design · 具体设计 30 35
· Coding · 具体编码 30 40
· Code Review · 代码复审 10 10
· Test · 测试(自我测试,修改代码,提交修改) 60 80
Reporting 报告 60 80
· Test Report · 测试报告 50 65
· Size Measurement · 计算工作量 10 10
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 30 30
Summary 合计 325 405

实现过程

第一次使用vs2017来进行项目的创建,有些功能的使用还不是很熟练,但是经过自学还是可以很快上手的。

在上传至coding的时候也遇到了一些疑惑,因为想要下载安装Git,使用它来进行上传。附简单教程以及coding使用常见问题

本题代码链接:https://coding.net/u/mingmoushanlai/p/MAXarrayproject/git?public=true

执行测试样例截图:


覆盖标准

上一篇博客我了解单元测试的好处:

  • 提高开发速度——可以以自动化方式执行的,提升了测试代码的执行效率。
  • 提高软件代码质量——它使用小版本发布至集成,便于实现人员除错。同时引入重构概念,让代码更干净和富有弹性。
  • 提升系统的可信赖度——它是回归测试的一种。支持修复或更正后的“再测试”,可确保代码的正确性

这次在课上了解到了白盒测试法。白盒法以程序(模块)内部的逻辑结构为基础来设计测试用例,主要用于单元测试。白盒法又称为逻辑覆盖法,其测试用例选择,是按照不同覆盖标准确定的。

白盒测试法的步骤

  • 选择逻辑覆盖标准。
  • 按照覆盖标准列出所有情况。
  • 选择确定测试用例。
  • 验证分析运行结果与预期结果。

这里有五个不同的覆盖标准

1.语句覆盖: 是最起码的结构覆盖要求,选择足够的测试用例,使得程序中每个语句至少都能被执行一次。
优点:以很直观地从源代码得到测试用例,无须细分每条判定表达式。
缺点:这种测试方法仅仅针对程序逻辑中显式存在的语句,但对于隐藏的条件和可能到达的隐式逻辑分支,是无法测试的。

2.判定覆盖: 执行足够的测试用例,使得程序中每个判定至少都获得一次“真”值和“假”值。即:程序中的每个分支至少执行一次。每个判断的取真、取假至少执行一次。
优点:判定覆盖比语句覆盖要多几乎一倍的测试路径,当然也就具有比语句覆盖更强的测试能力。同样判定覆盖也具有和语句覆盖一样的简单性,无须细分每个判定就可以得到测试用例。
缺点:往往大部分的判定语句是由多个逻辑条件组合而成,若仅仅判断其整个最终结果,而忽略每个条件的取值情况,必然会遗漏部分测试路径。

3.条件覆盖:执行足够的测试用例,使得判定中的每个条件获得各种可能的结果。即每个条件至少有一次为真值,有一次为假值。
优点:条件覆盖比判定覆盖,增加了对符合判定情况的测试,增加了测试路径。
缺点:要达到条件覆盖,需要足够多的测试用例,但条件覆盖并不能保证判定覆盖。条件覆盖只能保证每个条件至少有一次为真,而不考虑所有的判定结果。

4.判定/条件覆盖: 执行足够的测试用例,使得判定中每个条件取到各种可能的值,并使每个判定取到各种可能的结果。
优点:判定/条件覆盖满足判定覆盖准则和条件覆盖准则,弥补了二者的不足。
缺点:判定/条件覆盖准则的缺点是未考虑条件的组合情况。

5.条件组合覆盖: 执行足够的例子,使得每个判定中条件的各种可能组合都至少出现一次。
优点:多重条件覆盖准则满足判定覆盖、条件覆盖和判定/条件覆盖准则。更改的判定/条件覆盖要求设计足够多的测试用例,使得判定中每个条件的所有可能结果至少出现一次,每个判定本身的所有可能结果也至少出现一次。并且每个条件都显示能单独影响判定结果。
缺点:线性地增加了测试用例的数量。

在这里考虑到代码中的条件和判定,我选择了判定/条件覆盖标准来设计测试用例。


流程图及测试用例

在本函数的流程图中,循环内部程序中的每个分支至少执行一次,共有四个分支,如上图中的a、b、c、d。且判定中的每个条件获得各种可能的结果有四种,分别为①thissum>sum ②thissum≤sum ③thissum≤0 ④thissum>0我选择了 判定/条件覆盖标准来设计测试用例,为使得判定中每个条件取到各种可能的值,并使每个判定取到各种可能的结果,选取的样例如下:
测试用例①
n=5 数组数据为-4 8 -3 2 2 在这个n为5的循环中 每一种判定和条件所取得的可能都会实现。

测试用例②
当n=5 数组数据为-1 -2 -3 -4 -5 会出现数值全为负数的特殊情况。

测试结果如图所示:


总结与体会

个人实战练习比理论上的学习加大了难度,只有真正做这个练习的时候才知道它的艰难。个人开发技术对于一名软件工程师来说是十分重要的,在这个过程中能够衡量个人能力,我们也需要通过这次实战演练来明确学习一些主流软件开发工具的安装和使用过程,也要能够利用相关的方法分析软件的效能,用自动检测技术进行单元测试。

在自己进行这个题目的时候还是需要自己查询和解决许多问题,算法问题、新工具使用问题、测试问题。每解决一个问题就多了一份自信,也多了一份想要继续学习的好奇心。希望每一次写的博客都能给自己带来一些学习的动力和兴趣,希望每一次写的博客都能够记录自己在这段小时间内学习的成果,希望每一次都能够用心去对待每一篇,给未来的自己更多坚持下去的决心。

理论所不能解决的那些疑难,实践会给你解决。———— 费尔巴哈


个人实战演练全过程——No.1 最大连续子数组求和的更多相关文章

  1. lintcode循环数组之连续子数组求和

    v 题目:连续子数组求和 II 给定一个整数循环数组(头尾相接),请找出一个连续的子数组,使得该子数组的和最大.输出答案时,请分别返回第一个数字和最后一个数字的值.如果多个答案,请返回其中任意一个. ...

  2. lintcode :continuous subarray sum 连续子数组之和

    题目 连续子数组求和 给定一个整数数组,请找出一个连续子数组,使得该子数组的和最大.输出答案时,请分别返回第一个数字和最后一个数字的值.(如果两个相同的答案,请返回其中任意一个) 样例 给定 [-3, ...

  3. 剑指Offer面试题:28.连续子数组的最大和

    一.题目:连续子数组的最大和 题目:输入一个整型数组,数组里有正数也有负数.数组中一个或连续的多个整数组成一个子数组.求所有子数组的和的最大值.要求时间复杂度为O(n).例如输入的数组为{1,-2,3 ...

  4. 剑指Offer 连续子数组的最大和

    题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果向量 ...

  5. 剑指offer面试题31连续子数组的最大和

    一.题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果 ...

  6. 最大连续子数组问题2-homework-02

    1) 一维数组最大连续子数组 如第homework-01就是一维数组的最大子数组,而当其首位相接时,只需多考虑子数组穿过相接的那个数就行了! 2)二维数组 算法应该和第一次的相似,或者说是将二维转化为 ...

  7. 编程算法 - 连续子数组的最大和 代码(C)

    连续子数组的最大和 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入一个整型数组, 数组里有正数也有负数. 数组中一个或连续的多个整数组成一 ...

  8. 【剑指offer】连续子数组的最大和

    个開始,到第3个为止).你会不会被他忽悠住? 输入: 输入有多组数据,每组測试数据包括两行. 第一行为一个整数n(0<=n<=100000),当n=0时,输入结束.接下去的一行包括n个整数 ...

  9. 找一个数组的最大和的连续子数组(时间复杂度 O(n))(二)

    要求: 要求数组从文件读取. 如果输入的数组很大,  并且有很多大的数字,  就会产生比较大的结果 (考虑一下数的溢出), 请保证你的程序能正常输出. 另外, 如果输入文件的参数有错误, 这个程序应该 ...

随机推荐

  1. PyCharm 专业版激活方法

    郑重声明: JetBrains公司的PyCharm专业版是收费的,本文所述激活方法仅限于短时内体验和试用PyCharm专业版,使用后请当天立即删除.若需要继续使用PyCharm专业版,请在官网购买.当 ...

  2. SQL强化练习(面试与学习必备)

    一.经典选课题A 1.1.请同时使用GUI手动与SQL指令的形式创建数据库.表并添加数据. 题目:设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教 ...

  3. SQL SERVER中LIKE使用变量类型不同输出结果不一致解惑

    一同事在写脚本时,遇到一个关于LIKE里面使用不同的变量类型导致查询结果不一致的问题,因为这个问题被不同的人问过好几次,索性总结一下,免得每次都要解释一遍,直接丢一篇博客岂不是更方便!其实看似有点让人 ...

  4. 洗礼灵魂,修炼python(90)-- 知识拾遗篇 —— 协程

    协程 1.定义 协程,顾名思义,程序协商着运行,并非像线程那样争抢着运行.协程又叫微线程,一种用户态轻量级线程.协程就是一个单线程(一个脚本运行的都是单线程) 协程拥有自己的寄存器上下文和栈.协程调度 ...

  5. JAVA API的下载和中文查看API

    一.JAVA API的下载 1.1 JAVA由SUN公司开发,2006年SUN公司宣布将Java技术作为免费软件对外发布,标志着JAVA的公开免费.2009年,SUN公司被甲骨文公司收购,因此我们现在 ...

  6. 4.3Python数据处理篇之Matplotlib系列(三)---plt.plot()折线图

    目录 前言 (一)plt.plot()函数的本质 ==1.说明== ==2.源代码== ==3.展示效果== (二)plt.plot()函数缺省x时 ==1.说明== ==2.源代码== ==3.展示 ...

  7. 【算法】LeetCode算法题-Roman To Integer

    这是悦乐书的第145次更新,第147篇原创 今天这道题和罗马数字有关,罗马数字也是可以表示整数的,如"I"表示数字1,"IV"表示数字4,下面这道题目就和罗马数 ...

  8. May 23. 2018 Week 21st Wednesday

    You should love and take care of yourself because after all, it is your own life. 要学会爱自己,照顾自己,毕竟生活是你 ...

  9. Go学习笔记07-结构体与方法

    Go学习笔记07-结构体与方法 Go语言 面向对象 结构的定义与创建 面向对象 Go语言只支持封装,不支持继承和多态. Go语言中只有struct,即结构体:没有class. 结构的定义与创建 pac ...

  10. 《Java大学教程》--第1章 步入Java世界

    1.2 软件:用于计算机执行的指令的集合称之为程序(program).单个程序或者一组程序称之为软件(software)1.3 编译:计算机的语言称为机器码(machine code).用编译器(co ...