一、实验目的及要求
1.掌握白盒测试方法如综合运用路径覆盖及逻辑覆盖方法设计测试用例。
2.掌握单元测试工具UnitTest编写测试程序并执行,必要时辅助运用其他测试工具。
3.掌握单元测试执行方法、并分析测试结果。
二、实验设备(环境)及要求
根据白盒测试中的逻辑覆盖、路径覆盖设计相应的测试用例。
基于python的单元测试工具unittest编写单元测试代码,并截图记录测试执行结果。
三、实验内容
1.使用Unittest实现简单计算器的单元测试:
(1)基于用python语言提供的简单计算器测试源码如下:
class calculator:
a=10
b=20
def add(self):
return self.a+self.b
def sub(self):
return self.a-self.b
def multipy(self):
return self.a*self.b
def divide(self):
try:
return self.a/self.b
except ZeroDivisionError:
return("除数不能为0")
(2)测试用例设计:
测试对象
测试输入
预期结果
实际结果
add方法
a=10,b=20
30
30
Sub方法
a=10,b=20
-10
-10
Multipy方法
a=10,b=20
200
200
Divide方法
a=10,b=20
0.5
0.5
Divide方法
a=10,b=0
除数不能为0
除数不能为0
(3)用python语言编写单元测试用例。
import Cal_error_deal as cal
import HTMLTestRunner
import unittest
from unittest import TestCase
class TestCalculator(TestCase):
def setUp(self):
self.calObject=cal.calculator()
def test_add(self):
result=self.calObject.add()
self.assertEqual(result,30)
def test_sub(self):
result = self.calObject.sub()
self.assertEqual(result, -10)
def test_multipy(self):
result = self.calObject.multipy()
self.assertEqual(result, 200)
def test_divide(self):
self.calObject.b=0
result = self.calObject.divide()
self.assertEqual(result, '除数不能为0')
def suite():
calTestCase=unittest.TestSuite()
calTestCase.addTest(TestCalculator('test_add'))
calTestCase.addTest(TestCalculator('test_sub'))
calTestCase.addTest(TestCalculator('test_multipy'))
calTestCase.addTest(TestCalculator('test_divide'))
return calTestCase
if __name__=="__main__":
fp=open('res1.html','wb')
runner=HTMLTestRunner.HTMLTestRunner(stream=fp,title='简单计算机的测试',description='详情')
runner.run(suite())
print('测试')
fp.close()
(4)用HTMLTestRunner生成测试报告。
首先:将提供的现成HTMLTestRunner.py放置在Python安装路径下的Lib文件夹下,例如:D:\Program Files\Python35-32\Lib
接着在Python交互式窗口执行import HTMLTestRunner,不报错则可以使用HTMLTestRunner
(5)用Python覆盖率统计工具coverage,查看被测代码及测试代码的覆盖情况。
进入Python安装文件夹下的Script目录例如D:\Program Files\Python35-32\Scripts,打开命令行窗口执行如下命令
pip install -i https://pypi.doubanio.com/simple/ --trusted-host pypi.doubanio.com coverage
安装coverage。
在命令行测试import coverage,不报错则说明可以使用了。
拓展:
- 运用基本路径覆盖法对如下代码进行测试用例设计并测试
(1)被测代码
def function(a,b,c):
if((a>1)and(b==0)):
c=c/a
if((a==5)or(c>1)):
c=c+1
c=a+b+c
return c
(2)测试用例设计:
测试对象
测试输入
预期结果
实际结果
Function函数
a=1,b=2,c=1
c=4
c=4
Function函数
a=1,b=2,c=2
c=6
c=6
Function函数
a=5,b=2,c=1
c=9
c=9
Function函数
a=5,b=0,c=1
c=6.2
c=6.2
Function函数
a=5,b=0,c=5
c=7
c=7
(3)用python语言编写单元测试用例。
import HTMLTestRunner
import unittest
import function as fun
from unittest import TestCase
class TestFunction(TestCase):
def setUp(self) -> None:pass
def test_1(self):
result=fun.function(1,2,1)
self.assertEqual(result,4)
def test_2(self):
result=fun.function(1,2,2)
self.assertEqual(result,6)
def test_3(self):
result=fun.function(5,2,1)
self.assertEqual(result,9)
def test_4(self):
result = fun.function(5, 0, 1)
self.assertEqual(result, 6.2)
def test_5(self):
result = fun.function(5, 0, 5)
self.assertEqual(result, 7)
def suite():
calTestCase=unittest.TestSuite()
calTestCase.addTest(TestFunction('test_1'))
calTestCase.addTest(TestFunction('test_2'))
calTestCase.addTest(TestFunction('test_3'))
calTestCase.addTest(TestFunction('test_4'))
calTestCase.addTest(TestFunction('test_5'))
return calTestCase
if __name__=="__main__":
fp=open('res2.html','wb')
runner=HTMLTestRunner.HTMLTestRunner(stream=fp,title='基本路径覆盖法',description='详情')
runner.run(suite())
print('测试')
fp.close()
(4)用HTMLTestRunner生成测试报告。
(5)用Python覆盖率统计工具coverage,查看被测代码及测试代码的覆盖情况。
3.针对三角形问题进行单元测试
(1)基本路径覆盖被测代码
def triangleStyletest(a,b,c):
if(a<=0 or b<=0 or c<=0 or a+b<=c or a+c<=b or c+c<=a):
return "无法构成三角形"
elif(a==b and a==c and b==c):
return "构成等边三角形"
elif(a==b or a==c or b==c):
return "构成等腰三角形"
else:
return "构成不等边三角形"
(2)测试用例设计:
测试对象
测试输入
预期结果
实际结果
三角形判断函数
a=1,b=1,c=1
构成等边三角形
构成等边三角形
三角形判断函数
a=3,b=4,c=5
构成不等边三角形
构成不等边三角形
三角形判断函数
a=4,b=5,c=11
无法构成三角形
无法构成三角形
三角形判断函数
a=2,b=3,c=2
构成等腰三角形
构成等腰三角形
(3)用python语言编写单元测试用例。
import HTMLTestRunner
import unittest
import triangle as tri
from unittest import TestCase
class TestTriangle(TestCase):
def setUp(self) -> None:pass
def test_1(self):
result=tri.triangleStyletest(1,1,1)
self.assertEqual(result,'构成等边三角形')
def test_2(self):
result = tri.triangleStyletest(3, 4, 5)
self.assertEqual(result, '构成不等边三角形')
def test_3(self):
result = tri.triangleStyletest(4, 5, 11)
self.assertEqual(result, '无法构成三角形')
def test_4(self):
result = tri.triangleStyletest(2, 3, 2)
self.assertEqual(result, '构成等腰三角形')
def suite():
calTestCase=unittest.TestSuite()
calTestCase.addTest(TestTriangle('test_1'))
calTestCase.addTest(TestTriangle('test_2'))
calTestCase.addTest(TestTriangle('test_3'))
calTestCase.addTest(TestTriangle('test_4'))
return calTestCase
if __name__=="__main__":
fp=open('res3.html','wb')
runner=HTMLTestRunner.HTMLTestRunner(stream=fp,title='三角问题进行单元测试',description='详情')
runner.run(suite())
print('测试')
fp.close()
(4)用HTMLTestRunner生成测试报告。
(5)用Python覆盖率统计工具coverage,查看被测代码及测试代码的覆盖情况。
四、实验结果分析以及出现问题
主要问题及解决办法
心得体会
在现代软件开发流程中,软件测试占据了至关重要的地位。通过本次上机实验,我们旨在加深对单元测试的理解,掌握使用Python中的Unittest框架进行测试的方法,并通过实际操作来提高我们的测试设计和执行能力。
Unittest是Python自带的一个单元测试框架,它提供了组织和运行测试所需的所有工具。在实验中,我们首先学习了Unittest的基本用法,包括如何编写测试用例、设置测试环境、执行测试以及查看测试结果。
针对一个简单的计算器程序,我们运用Unittest编写了多个测试用例,涵盖了加、减、乘、除等基本运算。通过这一过程,我深刻体会到单元测试的核心在于隔离单个模块的功能进行验证,确保每个部分都能独立正确地工作。
在测试用例设计环节,我们采用了基本路径覆盖法来分析代码逻辑,识别关键路径,并据此设计测试用例。这种方法有助于我们更全面地覆盖代码的执行路径,减少遗漏潜在错误的可能性。
三角形问题是一个经典的边界值分析案例。我们通过对不同边长组合的测试,验证了程序是否能正确判断三角形的类型。这个过程中,我学到了边界条件测试的重要性,以及如何在单元测试中有效地应用边界值分析。
通过这次实验,我对软件测试有了更加深刻的认识。单元测试不仅是发现和修复bug的手段,更是预防错误的有效措施。同时,我也意识到良好的测试用例设计是提高测试效率和质量的关键。未来,我将更加注重测试用例的设计,力求使测试覆盖到每一个可能的场景。
此外,我还学会了如何使用自动化测试工具来提升测试的效率,这对于未来的软件开发工作无疑是一大助力。我相信,随着不断的学习和实践,我的软件测试技能将会得到进一步的提升。
版权归原作者 哈哈哈怦怦 所有, 如有侵权,请联系我们删除。