黑盒测试(一)(包含源码)
- 实验目的
(1)掌握测试用例设计的一般方法
(2)掌握基于等价类划分的黑盒测试方法
(3)掌握JUnit测试工具的使用
二、实验环境(仪器设备、软件等)
Windows10 idea
三、实验原理(或要求)
(1)每个测试用例至少包含编号,输入和预期输出三项内容
(2)按照测试用例进行测试并记录测试结果,将测试结果与预期结果进行比较,分析程序中是否有错误、失效和故障,并尝试改正程序
(3)可以使用Junit4或者Junit5,不能使用更低的版本。
四、实验步骤
(1)配置JUnit
如果使用Eclipse,按照步骤添加JUnit或者使用Maven添加JUnit。如果使用IDEA,配置方法类似。
如果使用Maven,pom.xml文件如下代码所示:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
public class Hello {
public int add(int x,int y) {
return x+y;
}
}
import static org.junit.Assert.assertEquals;
import org.junit.Before;
import org.junit.Test;
public class TestHello {
private Hello hello;
@Before
public void setUp() {
hello = new Hello();
}
@Test
public void testAdd() {
assertEquals(2, hello.add(1, 1));
}
}
在Hello.java中没有Error或Failure。
(2)编写教材上例2-8三角形问题的程序,利用等价类划分方法设计测试用例,使用JUnit运行测试用例,记录和分析测试结果。
有效等价类测试用例
编号 | 测试方法名 | 输入数据 | 预期输出 | 覆盖条件 | 状态 |
TC4 | testEquilateralTriangle | (3, 3, 3) | 等边三角形 | 三边严格相等 | ✅ |
TC5 | testIsoscelesTriangle | (3, 3, 4) | 等腰非等边三角形 | 两边相等且第三边不同 | ✅ |
TC6 | testScaleneTriangle | (5, 6, 7) | 一般三角形 | 三边均不相等且满足不等式 | ✅ |
TC7 | testNotATriangle | (1, 2, 3) | 非三角形 | 不满足三角形不等式 | ✅ |
无效等价类测试用例
编号 | 测试方法名 | 输入数据 | 预期异常/输出 | 覆盖条件 | 状态 |
TC1 | testNonIntegerInput | ["a", "4", "5"] | NumberFormatException | 非数字字符输入 | ✅ |
TC2 | testZeroInput | ["0", "4", "5"] | IllegalArgumentException | 零值输入 | ✅ |
TC3 | testInvalidArgumentCount | ["3", "4"] | IllegalArgumentException | 参数数量不足 | ✅ |
TC8 | testNegativeInput | ["-3", "4", "5"] | IllegalArgumentException | 负值输入 | ✅ |
TC9 | testOverflowInput | ["2147483648",4,5] | IllegalArgumentException | 整数溢出 | ✅ |
TC10 | testDecimalInput | ["4", "4.5", "5"] | NumberFormatException | 浮点数输入 | ✅ |
TC12 | testSpecialCharacterInput | ["3$", "4", "5"] | NumberFormatException | 特殊字符输入 | ✅ |
TC13 | testEmptyInput | ["", "4", "5"] | NumberFormatException | 空字符串输入 | ✅ |
package com.ruoyi;
import java.util.Arrays;
public class TriangleChecker {// 命令行入口方法public static void main(String[] args) {try {if (args.length != 3) {throw new IllegalArgumentException("错误:需要3个整数参数");}int a = parseInput(args[0]);int b = parseInput(args[1]);int c = parseInput(args[2]);System.out.println(checkTriangle(a, b, c));} catch (Exception e) {System.out.println(e.getMessage());}}// 核心判断逻辑public static String checkTriangle(int a, int b, int c) {validateSides(a, b, c);if (!isValidTriangle(a, b, c)) {return "非三角形";}if (a == b && b == c) {return "等边三角形";}if (a == b || b == c || a == c) {return "等腰非等边三角形";}return "一般三角形";}// 输入验证方法private static int parseInput(String input) {if (!input.matches("^\\d+$")) {throw new NumberFormatException("错误:输入必须为整数");}if (input.contains(".")) {throw new NumberFormatException("错误:输入必须为整数");}long value = Long.parseLong(input);if (value > Integer.MAX_VALUE) {throw new IllegalArgumentException("错误:输入超过最大值");}if (value <= 0) {throw new IllegalArgumentException("输入必须为正整数");}return (int) value;}// 三角形验证逻辑private static boolean isValidTriangle(int a, int b, int c) {int[] sides = {a, b, c};Arrays.sort(sides);return sides[0] + sides[1] > sides[2];}// 参数验证private static void validateSides(int... sides) {for (int side : sides) {if (side <= 0) {throw new IllegalArgumentException("输入必须为正整数");}}}
}import com.ruoyi.TriangleChecker;
import org.junit.Test;
import static org.junit.Assert.*;public class TriangleCheckerTest {// 有效等价类测试@Testpublic void testEquilateralTriangle() { // TC4assertEquals("等边三角形", TriangleChecker.checkTriangle(3, 3, 3));}@Testpublic void testIsoscelesTriangle() { // TC5assertEquals("等腰非等边三角形", TriangleChecker.checkTriangle(3, 3, 4));}@Testpublic void testScaleneTriangle() { // TC6assertEquals("一般三角形", TriangleChecker.checkTriangle(5, 6, 7));}@Testpublic void testNotATriangle() { // TC7assertEquals("非三角形", TriangleChecker.checkTriangle(1, 2, 3));}// 无效等价类测试@Testpublic void testZeroInput() { // TC2try {TriangleChecker.main(new String[]{"0", "4", "5"});fail("未抛出预期异常");} catch (IllegalArgumentException e) {assertEquals("错误:边长必须为正整数", e.getMessage());}}@Testpublic void testNegativeInput() { // TC8try {TriangleChecker.main(new String[]{"-3", "4", "5"});fail("未抛出预期异常");} catch (IllegalArgumentException e) {assertEquals("错误:边长必须为正整数", e.getMessage());}}@Testpublic void testInvalidArgumentCount() { // TC3try {TriangleChecker.main(new String[]{"3", "4"});fail("未抛出预期异常"); // 添加此行} catch (IllegalArgumentException e) {assertEquals("错误:需要3个整数参数", e.getMessage());}}@Testpublic void testDecimalInput() { // TC10try {TriangleChecker.main(new String[]{"4", "4.5", "5"});fail("未抛出预期异常");} catch (NumberFormatException e) {assertEquals("错误:输入必须为整数", e.getMessage());}}@Testpublic void testNonIntegerInput() { // TC1try {TriangleChecker.main(new String[]{"a", "4", "5"});fail("未抛出预期异常");} catch (NumberFormatException e) {assertEquals("错误:输入必须为整数", e.getMessage());}}@Testpublic void testSpecialCharacterInput() { // TC12try {TriangleChecker.main(new String[]{"3$", "4", "5"});fail("未抛出预期异常");} catch (NumberFormatException e) {assertEquals("错误:输入必须为整数", e.getMessage());}}@Testpublic void testEmptyInput() { // TC13try {TriangleChecker.main(new String[]{"", "4", "5"});fail("未抛出预期异常");} catch (NumberFormatException e) {assertEquals("错误:输入必须为整数", e.getMessage());}}@Testpublic void testOverflowInput() { // TC9try {TriangleChecker.main(new String[]{"2147483648", "4", "5"});fail("未抛出预期异常");} catch (IllegalArgumentException e) {assertEquals("错误:输入超过最大值", e.getMessage());}}
}