软件测试实验3
一、 实验目的
1.掌握单元测试技术,并按单元测试的要求设计测试用例。
2.掌握一种单元测试工具的使用。
二、 实验内容
自行学习C#或python或C++的其中一种单元测试工具的使用,自选一段单元代码(不少于15行),进行测试。完成实验报告。
三、实验步骤及结果
1. 被测代码选择
我选择了一个简单的计算器类作为被测代码,包含加法、减法、乘法和除法四种基本运算,代码如下:
class Calculator:
"""简单的计算器类"""
def add(self, a, b):
"""加法运算"""
return a + b
def subtract(self, a, b):
"""减法运算"""
return a - b
def multiply(self, a, b):
"""乘法运算"""
return a * b
def divide(self, a, b):
"""除法运算"""
if b == 0:
raise ValueError("除数不能为零")
return a / b
def calculate(self, operation, a, b):
"""根据操作符计算结果"""
operations = {
'+': self.add,
'-': self.subtract,
'*': self.multiply,
'/': self.divide
}
if operation not in operations:
raise ValueError("不支持的操作符")
return operations[operation](a, b)
2. 测试用例设计
根据单元测试的要求,我为每个方法设计了多个测试用例,包括正常情况和边界情况:
- 加法测试
测试场景 |
输入参数 |
预期输出 |
测试要点 |
正整数相加 |
(2, 3) |
5 |
基本功能验证 |
负数相加 |
(-1, -1) |
-2 |
负数处理 |
小数相加 |
(0.1, 0.2) |
0.3 |
浮点数精度 |
零值相加 |
(0, 5) |
5 |
边界条件 |
- 减法测试
测试场景 |
输入参数 |
预期输出 |
测试要点 |
正数相减 |
(5, 3) |
2 |
基本功能 |
结果为负 |
(3, 5) |
-2 |
负数结果 |
小数相减 |
(0.3, 0.1) |
0.2 |
浮点数精度 |
相同数相减 |
(5, 5) |
0 |
边界条件 |
- 乘法测试
测试场景 |
输入参数 |
预期输出 |
测试要点 |
正数相乘 |
(2, 3) |
2 |
基本功能 |
负数相乘 |
(-2, 3) |
-2 |
符号处理 |
小数相乘 |
(0.1, 0.2) |
0.02 |
浮点数精度 |
乘以零 |
(5, 0) |
0 |
边界条件 |
- 除法测试
测试场景 |
输入参数 |
预期输出 |
测试要点 |
整数除法 |
(6, 3) |
2 |
基本功能 |
小数结果 |
(1, 3) |
0.333 |
循环小数 |
相同数相除 |
(5, 5) |
1 |
边界条件 |
除数为零 |
(5, 0) |
抛出异常 |
异常处理 |
- 综合计算测试
测试场景 |
输入参数 |
预期输出 |
测试要点 |
加法运算 |
('+', 2, 3) |
5 |
基本功能 |
不支持操作符 |
('%', 5, 3) |
抛出异常 |
异常处理 |
除法异常传递 |
('/', 5, 0) |
0.2 |
异常传递 |
3. 测试代码实现
import unittest
from calculator import Calculator
class TestCalculator(unittest.TestCase):
"""Calculator类的单元测试"""
def setUp(self):
"""在每个测试方法前执行"""
self.calc = Calculator()
def test_add(self):
"""测试加法"""
self.assertEqual(self.calc.add(2, 3), 5)
self.assertEqual(self.calc.add(-1, 1), 0)
self.assertAlmostEqual(self.calc.add(0.1, 0.2), 0.3, places=7)
self.assertEqual(self.calc.add(0, 5), 5)
def test_subtract(self):
"""测试减法"""
self.assertEqual(self.calc.subtract(5, 3), 2)
self.assertEqual(self.calc.subtract(3, 5), -2)
self.assertAlmostEqual(self.calc.subtract(0.3, 0.1), 0.2, places=7)
self.assertEqual(self.calc.subtract(5, 5), 0)
def test_multiply(self):
"""测试乘法"""
self.assertEqual(self.calc.multiply(2, 3), 6)
self.assertEqual(self.calc.multiply(-2, 3), -6)
self.assertAlmostEqual(self.calc.multiply(0.1, 0.2), 0.02, places=7)
self.assertEqual(self.calc.multiply(5, 0), 0)
def test_divide(self):
"""测试除法"""
self.assertEqual(self.calc.divide(6, 3), 2)
self.assertAlmostEqual(self.calc.divide(1, 3), 0.3333333, places=7)
self.assertEqual(self.calc.divide(5, 5), 1)
with self.assertRaises(ValueError):
self.calc.divide(5, 0)
def test_calculate(self):
"""测试calculate方法"""
self.assertEqual(self.calc.calculate('+', 2, 3), 5)
self.assertEqual(self.calc.calculate('-', 5, 3), 2)
self.assertEqual(self.calc.calculate('*', 2, 3), 6)
self.assertEqual(self.calc.calculate('/', 6, 3), 2)
with self.assertRaises(ValueError):
self.calc.calculate('%', 5, 3)
with self.assertRaises(ValueError):
self.calc.calculate('/', 5, 0)
if __name__ == '__main__':
unittest.main()
截图:
四、个人体会
通过本次实验,我掌握了单元测试的基本概念和重要性,如何使用Python的unittest框架编写单元测试,如何设计全面的测试用例,包括正常情况和异常情况,如何使用断言方法验证结果,如何测试异常情况。
单元测试是保证代码质量的重要手段,通过编写全面的测试用例,可以在早期发现代码中的问题,提高代码的可靠性和可维护性。今后在开发中,我将坚持为每个模块编写单元测试,确保代码质量。