实验三,基于Unittest框架的单元测试
一,实验目的
(1) 掌握单元测试技术,并按单元测试的要求设计测试用例。
(2) 能熟练应用功能性测试技术进行测试用例设计;
(3) 能熟练应用结构性测试技术进行测试用例设计;
(4) 对测试用例进行优化设计;
二, 实验环境
主流PC机一套,要求安装windows操作系统、PyCharm开发工具和OFFICE工具;
三,实验内容:
接受三个正整数a、b、c作为输入,用做三角形的边。三边必须满足条件: 0<a、b、c≤200;程序的输出是由这三条边确定的三角形类型:等边三角形、等腰三角形、普通三角形或不构成三角形。
参考程序:
#inclide<stdio.h>
main( )
{ int a,b,c;
scanf(″%d,%d,%d″,&a,&b,&c);
if(a<0||a>200||b<0||b>300||c<0||c>200)
printf(″数据输入有错,不满足0<a、b、c≤200″);
else if(a+b<=c||b+c<=a||a+c<=b)
printf(″不构成三角形″);
else if(a==b && b==c)
printf(″等边三角形″);
else if(a==b ||b==c||c==a)
printf(″等腰三角形″);
else
printf(″普通三角形″);
}
(1)利用Python语言改成测试程序
#-*- codeing = utf-8 -*-
#@Time : 2021/6/24 14:18
#@Author : 我是nefu小白
#@File : trangle.py
#@Software : PyCharm
def trangle():
a = float(input("请输入三角形第一条边的长度:"))
b = float(input("请输入三角形第一条边的长度:"))
c = float(input("请输入三角形第一条边的长度:"))
if ((a < 0 or a > 200 ) and (b < 0 or b > 200) and (c < 0 or c > 200)):
print("输入数据有错,不满足 0 < a, b, c < 200")
else:
if (a + b <= c or b + c <= a or a + c <= b):
print("不能构成三角形")
elif (a == b == c):
print("等边三角形")
elif (a == b or b == c or a == c):
print("等腰三角形")
else:
print("普通三角形")
if __name__ == '__main__':
trangle()
(2)利用等价类划分的方法,给出足够的测试用例。
① 如果不满足后面三个条件中的任意一个,则程序输出“非三角形”;
② 如果3条边相等,则程序输出“等边三角形”;
③ 如果有且仅有两条边相等,则程序输出“等腰三角形”;
④ 如果3条边都不相等,则程序输出为“一般三角形”。
显然这四种情况是相互排斥的。
三角形问题包含了清晰而有复杂的逻辑关系,因此经常在软件测试的问题分析中被用到。
仔细分析三角形问题,我们可以得到一个等价类表如下图,然后根据这个表格来设计覆盖上述等价类的测试用例。
覆盖无效类的测试用例
(3)利用Unittest框架编写测试程序,执行这些测试用例。
Unittest测试程序:
#-*- codeing = utf-8 -*-
#@Time : 2021/6/24 14:58
#@Author : 我是nefu小白
#@File : trangleTest.py
#@Software : PyCharm
import unittest
import trangle;
class trangleTest(unittest.TestCase):
def setUp(self):
"""在这里做资源初始化"""
pass
def tearDown(self):
"""在这里做资源的释放"""
pass
def test_trangle1(self):
trangle.trangle(1.5, 4, 5)
def test_trangle2(self):
trangle.trangle(3.5, 2.5, 5)
def test_trangle3(self):
trangle.trangle(2.5, 4.5, 5.5)
def test_trangle4(self):
trangle.trangle(3, 3, 3)
def test_trangle5(self):
trangle.trangle(200, 104, 105)
def test_trangle6(self):
trangle.trangle(3, 3, 3)
def test_trangle7(self):
trangle.trangle(4, 5, 2)
def test_trangle8(self):
trangle.trangle(3, 0, 8)
def test_trangle9(self):
trangle.trangle(0, 6, 0)
def test_trangle10(self):
trangle.trangle(0, 0, 0)
def test_trangle11(self):
trangle.trangle(-3, 4, 6)
def test_trangle12(self):
trangle.trangle(2, -7, -5)
def test_trangle13(self):
trangle.trangle(-3, -4, -5)
def test_trangle14(self):
trangle.trangle(101, 4, 5)
def test_trangle15(self):
trangle.trangle(3, 101, 102)
def test_trangle16(self):
trangle.trangle(101, 104, 105)
if __name__ == '__main__':
unittest.main()
执行测试用例结果:
四,实验结果与分析
本次实验没有遇到任何麻烦的问题,一些小问题均是搜索百度,B站,和各种blog解决。
感想:
之前,我一直不知道写单元测试测有什么用,因为单元测试只是把写好的程序运行了一遍,并没有创建新的逻辑,我心里在疑惑“我已经将程序按照我的想法写好了,它就会按照我的设计来运行,为什么要用单测重新走一遍呢?”,后来出了一个事情,代码出了BUG,我调试了好久,才发现问题出在”obja.equals(objb)”,因为obja和objb一个是Long一个是Integer,所以即使数值相同,也不会相等。
从那一刻,我发现单元测试做的事情,其实就是“验证程序是否按照我的想法在运行”,这才是它的终极目的,但是,这却是很关键的事情,设计往往没有错,但是写出来的代码却经常并不是按照我们所想的去运行的。
单元测试,就是验证代码是不是按照我们想象的在运行,这也是单测这个技术的意义所在。
文档下载链接:单元测试实验报告