有效的单元测试

有效的单元测试

​ 好的单元测试会有一些原则,说起来比较容易,但是书写起来就有一些抽象,不太好实践。换一个思路,只要你的单元测试不要出现一些错误,这样对于书写者来说是更容易接受和实践的。在这罗列些单元测试中不要出现的情况:

人格分裂

​ 好的单元测试不能出现“人格分裂”的情况,单元测试是个单纯的小家伙,没有什么胃口,他只能处理一种情况并妥善执行。如果单元测试中测试了多个功能,那就属于人格分裂。

示例

func TestNum(t *testing.T) {
	testNum := 1
	evenRes := IsEven(testNum)
	primeRes := IsPrime(testNum)
  
  expectEven := false
	expectPrime := false
	assert.Equal(t, expectEven, evenRes)
	assert.Equal(t, expectPrime, primeRes)
}

该对他做点什么

​ 拆成两个单元测试

func TestIsEven(t *testing.T) {
	testNum := 1
	evenRes := IsEven(testNum)
  
  expectEven := false
	assert.Equal(t, expectEven, evenRes)
}

func TestIsPrime(t *testing.T) {
	testNum := 1
	primeRes := IsPrime(testNum)
 
  expectPrime := false
	assert.Equal(t, expectPrime, primeRes)
}

魔法数字

​ 在程序的任意位置,魔法数字都是不好的并且应该避免。在写单元测试时,需要构造一些假的参数,这些假的参数我们可能会给赋值为1,事后阅读时你可能就会忘记这个1表示什么含义,带来不必要的麻烦,并且一个魔法值的出现基本不会只有一次,两次中1是不是表示同一个含义就有待商榷。

示例

func TestIsEven(t *testing.T) {
	evenRes := IsEven(1)
  
	assert.Equal(t, false, evenRes)
}

该对他做点什么

​ 1这个数字表示要测试的数字,false是预期的结果。这个都可以通过变量的方式让其更容易理解

func TestIsEven(t *testing.T) {
	testNum := 1
	evenRes := IsEven(testNum)
  
  expectEven := false
	assert.Equal(t, expectEven, evenRes)
}

条件逻辑

​ 在单元测试中出现了条件逻辑,此时是非常不好的,会给阅读带来很大的麻烦。

示例

func Test(t *testing.T) {
	tests := []int{1,2}

	for i := range tests {
		realRes := IsEven(i)
		if i == 1 {
			assert.Equal(t, false, realRes)
		}else if i == 2 {
			assert.Equal(t, true, realRes)
		}
	}
}

该对他做点什么

​ 上述条件逻辑中,判断如果数是1则给一个期望值。这种直接改为组测试。按照顺序先后赋予预期结果。

func Test(t *testing.T) {
	tests := []int{1,2}
	
	expectRes := []bool{false,true}
	for i := 0; i < len(tests); i++ {
		realRes := IsEven(tests[i])
		assert.Equal(t, expectRes[i], realRes)
	}
}

注释掉的测试

​ 注释是帮助程序员去理解源代码,但是往往会适得其反,迷惑或者误导我们。关于测试中的注释经常出现整个测试方法被注释掉,这种就会非常的误导人。要猜测书写时的用意。

示例

//func Test(t *testing.T) {
//	tests := []int{1,2}
//
//	expectRes := []bool{false,true}
//	for i := 0; i < len(tests); i++ {
//		realRes := IsEven(tests[i])
//		assert.Equal(t, expectRes[i], realRes)
//	}
//}

该对他做点什么

​ 问下身边有没有对这个了解的人,了解后按照正确的方式完善这个注释的测试方法。如果没有直接删掉。

永不失败的测试

​ 不能失败的测试不具有价值,出了事情不警告你。

示例

func TestIsEven(t *testing.T) {
	testNum := 1
	evenRes := IsEven(testNum)
	fmt.Println(evenRes)
}

该对他做点什么

​ 此代码永远不会失败,都不会给出一个明确的结果。没有意义。类似的情况还有try catch掉异常和错误,代码不会报错。也是同样的道理。

func TestIsEven(t *testing.T) {
	testNum := 1
	expectEven := false
	evenRes := IsEven(testNum)
	assert.Equal(t, expectEven, evenRes)
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
单元测试报告 版本:V1.3 文 档 编 号 保 密 等 级 作 者 最后修改日期 审 核 人 最后审批日期 批 准 人 最后批准日期 修订记录 日期 版本 修订说明 修订人 目 录 1 简介 2 1.1 目的 2 1.2 背景 2 1.3 范围 2 2 测试用例清单 2 3 功能测试分析 2 4 边界测试分析 2 5 覆盖率分析 2 6 内存使用分析 2 7 典型缺陷记录 3 7.1 缺陷1 3 7.1.1 表现 3 7.1.2 原因 3 7.1.3 方案 3 8 测试数据分析 3 8.1 测试有效性分析 3 8.2 测试效率分析 3 9 产品质量分析 4 10 测试结论 4 简介 目的 【描述该单元测试报告的目的。】 背景 【描述单元测试报告的背景,单元测试活动目的。如无特殊背景信息,可裁剪。】 范围 【说明该单元测试报告在整个项目周期的适用范围】 测试用例清单 模块 目标类 级别 用例类 用例描述 执行结果 备注 【被测的代码类】 【代码级别】 【Junit测试类1】 【意图描述】 【P/F】 【Junit测试类2】 功能测试分析 边界测试分析 覆盖率分析 目标类 级别 方法覆盖率 行覆盖率 备注 【被测的代码类】 【代码级别】 内存使用分析 典型缺陷记录 记录单元测试中所发现的典型缺陷或常见缺陷。供再次发现同类问题时,作为参考使用。 缺陷1 表现 【缺陷表现描述】 原因 【缺陷产生原因分析描述】 方案 【解决方案描述】 测试有效性分析 【统计实际发现的缺陷数据,分析与计划值产生偏差的原因,结合《项目量化管理计划》定义的阈值,确定是否采取相关措施】 计划发现缺陷数 致命 严重 一般 实际发现缺陷数 偏差分析 对策或调整措施 产品质量分析 【结合上述数据和信息,对本次测试的项目、产品的本身质量进行分析、评价和总结】 测试结论  【描述测试是否达到测试计划的目的,是否满足单元测试的结束条件。】
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值