软件构造——关于测试和测试优先编程

一个软件的生命周期大体可以分为如下几个部分,首先是获取对于软件的需求,根据需求进行建模,建模完毕后就去设计并运行程序,如果这个软件是某个某个整体架构的一部分或是软件的各部分由多人分工完成那么就要进行集成,最后是发布软件加上维护软件。
软件的测试过程发生在上面说明的设计并运行程序部分(特指单元测试,集成测试发生在集成部分),对于很多高质量要求的软件,软件测试工作占据的时间占据了软件开发时间的绝大部分。
首先要明确为什么要对软件进行测试,关于软件生命周期的第一部分——对软件的需求,显然只有经过了测试才能明白软件是否达到需求,测试是提高软件质量的重要手段。另外还要明白的一点就是测试的目的并不是让软件完全没有错误,而是尽可能发现错误,你无法穷尽所有输入的可能性,再好的测试也无法发现软件中存在的全部错误。既然如此,那么对于一个良好测试的定义是什么,又如何对软件进行测试呢?
测试的基本单元就是测试用例,所谓测试用例就是对某段执行程序的一个输入,观察输入是否符合期望,良好的测试与良好的测试用例是绑定的,判断输出是否符合期望是根据规约,所以在确定规约之后,良好的编程风格就是一并写好符合规约的测试用例,接下来写代码,执行测试,若出错则修改代码,再执行测试,这就是测试优先编程。规约决定测试用例,而书写测试用例同时也能帮助程序员更好地理解和完善规约。
下面说一下单元测试在java中的具体表现形式,java向我们提供了一个方便的单元测试框架junit,相关的操作就是在IDE中创建一个与src并列的source folders,右击想要进行测试的文件,即可在test中生成一个对应的junit test case,在一个test类中,会包含很多@test方法,这些方法是对被测试类中的方法进行测试,彼此独立运行。关于输出是否符合规约的判断在java中采用assert断言的形式判断,最常用的是assertEquals,当然也包括其他的像
assertFalse,assertTrue等等。比如说下面这个样例:

public class CommonPlanningEntryTest {

	@Test
	public void testGetname() {
		CommonPlanningEntry A=new CommonPlanningEntry("CA111",new Location("哈尔滨",10,10),new Location("南京",10,10),"2020-4-22 14:00","2020-4-22 15:00");
		assertEquals("CA111",A.getname());
	}

	@Test
	public void testGetstate() {
		CommonPlanningEntry A=new CommonPlanningEntry("CA111",new Location("哈尔滨",10,10),new Location("南京",10,10),"2020-4-22 14:00","2020-4-22 15:00");
		assertEquals("未分配",A.getstate());
	}

	}

testGetname(),testGetstate()就是两个测试方法,都使用了assertEquals判断输出是否符合期望。但上面代码只选择了一个测试用例,虽然很简洁,但对于验证错误显然是不够的,一个良好的测试需要选取最少的测试用例并尽可能大地发现程序的错误,由于事先对被测函数设立了规约,那么基于这样的假设:相似的输入,将会展示相似的行为,根据规约的输入空间划分等价类,则可从每个等价类中选择一个代表作为测试用例。

/** 
* @param a an argument 
* @param b another argument 
* @return the larger of a and b. 
*/
 public static int max(int a, int b)

上面这个求两个数最大值的函数,根据规约划分等价类可以分为三种,a<b,a=b,a>b,那么输入的测试用例可以选取这三种情况的代表(a, b) = (0, 2) ,(a, b) = (7, 7) ,(a, b) = (9, 2) 。
除了根据等价类划分选取测试用例,还有一种补充的边界值分析方法,经验表明大量的错误发生在输入域的“边 界”而非中央 ,拿max函数举例,除了a<b,a=b,a>b的划分,0作为数的一个边界,可以引出a<0,a=0,a>0的划分,实际运用中这两种挑选测试用例方法往往是组合起来,让每个维度的每个取值至少被1个测试用例覆盖一次。
挑选测试用例的测试策略是需要被显示记录的,在每个test类的开头都要详细说明自己的测试策略,划分的等价类,另外在每个测试方法前面都要显示注明这个测试方法覆盖的维度。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值