实验三:软件测试
一、实验内容:
对“输入的n个整数进行排序”的代码进行单元测试
二、设计单元测试用例
--基于Pycharm开发环境
--使用冒泡排序对列表进行升序排序
--利用unittest对所编写代码进行单元测试
测试代码如下:
import unittest
def line(num):
n = len(num)
for i in range(1, n):
for j in range(0, n - 1):
if num[i] < num[j]:
temp = num[i]
num[i] = num[j]
num[j] = temp
return num
class TestFun(unittest.TestCase):
def setUp(self):
print("测试1开始")
def test_line(self):
#测试1:空列表
self.assertEqual(line([]),[])
#测试2:一个元素的列表
self.assertEqual(line([5]),[5])
#测试3:已排好的列表
self.assertEqual(line([1,2,3,4]),[1,2,3,4])
#测试4:逆序的列表
self.assertEqual(line([4,3,2,1]),[1,2,3,4])
#测试5:包含重复元素的列表
self.assertEqual(line([3,2,1,3,2,1]),[1,1,2,2,3,3])
#测试6:随机顺序列表
self.assertEqual(line([8,5,7,4,6,1,3,2]),[1,2,3,4,5,6,7,8])
def tearDown(self):
print("测试1结束")
class TestFun2(unittest.TestCase):
def setUp(self):
print("测试2开始")
def test_line2(self):
self.assertEqual(line([20,5,8,1,3,4,6,7,2,9,15,14,18,13,16,12,17,19,11,10]),[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20])
def tearDown(self):
print("测试2结束")
if __name__=='__main__':
unittest.main()
生成报告代码如下:
import unittest
from Test import TestFun
from Test import TestFun2
from htmltestreport import HTMLTestReport
suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(TestFun))
suite.addTest(unittest.makeSuite(TestFun2))
# 实例化HTMLTestReport对象
report_path = "report.html"
report = HTMLTestReport(report_path, title='单元测试报告', description='test函数测试报告V1.0')
# 执行测试套件
report.run(suite)
三、单元测试结果截图
四、实验中遇到的问题及解决方法
1.对排序函数结果的比较忘记设置返回值,使比较数据为空,导致测试失败,经改正解决。
2.设置的两个测试类错误的使用了相同的方法名导致测试错误,经改正解决。
3.设置的测试用例不能完全覆盖所有情况,经改正解决。
4.使用unittest生成测试报告时,由于只有一个测试类导致图表展示为空,设置两个测试类之后解决。
采用单元测试对冒泡排序代码进行测试是一种很好的做法,它可以帮助我们确保代码的正确性和可靠性。以下是单元测试的优点和不足:
优点:
确保代码正确性:单元测试可以确保冒泡排序函数在各种情况下都能正确工作。例如,你可以测试排序空数组、一个元素的数组、多个元素的数组,以及已排序和未排序的数组等情况。
及早发现问题:如果在开发早期阶段就编写单元测试,那么一旦代码引入新的错误或缺陷,单元测试会立即捕捉到这些问题,使得问题能够及早被发现和解决。
提高代码质量:单元测试促使我们编写更可维护和更健壮的代码。因为我们需要考虑各种可能的输入和边界情况,这会使得我们的代码更加健壮。
文档作用:单元测试本身也可以作为代码功能的一种文档。它们清楚地展示了函数应该如何工作,对于其他开发者理解和使用代码非常有帮助。
不足:
需要额外的时间和资源:编写单元测试需要投入额外的时间和资源。这可能会增加开发初期的成本。
维护成本:当代码发生变化时,单元测试也需要相应地进行更新和维护。这可能会增加额外的维护成本。
测试覆盖度问题:虽然单元测试可以帮助我们捕捉许多问题,但它并不能保证代码完全没有错误。有些复杂的情况或边缘情况可能没有被单元测试覆盖到。
可能过度测试:有时,我们可能会编写过多的单元测试,以至于它们变得冗余或没有必要。这可能会导致资源浪费和效率降低。
总的来说,尽管单元测试有一些潜在的坏处,但它的好处通常远大于坏处。对于冒泡排序这样的基础算法,编写单元测试是一种很好的做法,可以帮助我们确保代码的正确性和可靠性。