JUnit单元测试实训报告

1. 基本信息
名称JUnit单元测试
时间X月X日
测试人XXX
学号xxxxxxxxx
年级专业班级xxxx级xxxx专业xxxxxx班
目标理解JUnit作为白盒测试工具的本质,通过编写代码验证方法逻辑的正确性,关注程序内部执行路径的覆盖。学习JUnit的核心注解(@Test、@Before、@After)和断言方法(如Assert.assertEquals),实现测试用例的独立执行与结果验证。构建自动化测试能力,提升持续集成与高质量交付工程能力。

2. 测试思路与测试环境
测试思路的具体说明

本次测试主要针对Triangle类的功能进行单元测试,重点验证三角形类型的判断逻辑是否正确,以及面积、周长计算等功能是否符合预期。通过JUnit框架,我们设计了多个测试用例,涵盖以下场景:

  1. 边长超出范围的情况(无效三角形)。
  2. 等边三角形、等腰三角形、直角三角形、一般三角形的判断。
  3. 无法构成三角形的情况。
  4. 面积和周长的计算验证。
  5. toString方法输出的正确性。

所有测试用例均使用JUnit的@Test注解,并通过Assertions类中的断言方法验证结果。

测试环境的具体说明
  • 开发工具:IntelliJ IDEA 2024.3.5
  • 测试框架:JUnit 5
  • 操作系统:Windows 11
  • 编程语言:Java 21

3. 测试内容
1. 测试对象分析说明

测试对象为Triangle类,该类的主要功能包括:

  1. 判断三角形类型(等边、等腰、直角、一般、无法构成、无效)。
  2. 计算三角形的面积(基于海伦公式)。
  3. 计算三角形的周长。
  4. 提供toString方法,返回三角形类型的字符串描述。
2. 测试步骤说明
  1. 创建Triangle类实例时,传入不同的边长参数,验证构造函数是否正确抛出异常或初始化对象。
  2. 调用getType方法,验证返回的三角形类型是否符合预期。
  3. 调用getArea方法,验证面积计算是否正确。
  4. 调用getCircumference方法,验证周长计算是否正确。
  5. 调用toString方法,验证返回的字符串描述是否正确。
3. 具体的测试用例列表及执行结果
测试用例编号测试用例描述输入数据预期结果实际结果测试状态
getType01边长超出范围a=101, b=101, c=101抛出异常抛出异常通过
getType02等边三角形a=50, b=50, c=50TriangleType.EquilateralTriangleType.Equilateral通过
getType03无法构成三角形a=3, b=4, c=8TriangleType.NoTriangleTriangleType.General不通过
getType04等腰三角形a=3, b=3, c=4TriangleType.IsoscelesTriangleType.Isosceles通过
getType05直角三角形a=3, b=4, c=5TriangleType.RightAngledTriangleType.RightAngled通过
getType06一般三角形a=2, b=3, c=4TriangleType.GeneralTriangleType.General通过
getArea面积计算a=3, b=4, c=56.06.0通过
getCircumference周长计算a=3, b=4, c=51212通过
testToString字符串描述a=3, b=4, c=5“直角三角形”“直角三角形”通过

4. 测试结果与分析
测试结果

在本次单元测试中,大部分测试用例均通过,但测试用例 getType03 未能通过,具体原因如下:

测试用例编号测试用例描述输入数据预期结果实际结果测试状态
getType01边长超出范围a=101, b=101, c=101抛出异常抛出异常通过
getType02等边三角形a=50, b=50, c=50TriangleType.EquilateralTriangleType.Equilateral通过
getType03无法构成三角形a=3, b=4, c=8TriangleType.NoTriangleTriangleType.General不通过
getType04等腰三角形a=3, b=3, c=4TriangleType.IsoscelesTriangleType.Isosceles通过
getType05直角三角形a=3, b=4, c=5TriangleType.RightAngledTriangleType.RightAngled通过
getType06一般三角形a=2, b=3, c=4TriangleType.GeneralTriangleType.General通过
getArea面积计算a=3, b=4, c=56.06.0通过
getCircumference周长计算a=3, b=4, c=51212通过
testToString字符串描述a=3, b=4, c=5“直角三角形”“直角三角形”通过
分析
  1. 类型判断问题

    • 在测试用例 getType03 中,输入的三角形边长为 a=3, b=4, c=8,根据三角形不等式(任意两边之和大于第三边),该组边长无法构成三角形。
    • 预期结果为 TriangleType.NoTriangle,但实际返回了 TriangleType.General,表明 getType 方法的逻辑存在问题。
  2. 代码问题定位

    • 检查 Triangle 类的 getType 方法发现,以下条件判断存在逻辑错误:
      if (this.sideA + this.sideB > this.sideC
              || this.sideA + this.sideC > this.sideB
              || this.sideB + this.sideC > this.sideA) {
          if (this.sideA == this.sideB || this.sideB == this.sideC || this.sideA == this.sideC)
              return TriangleType.Isosceles;
          else
              return TriangleType.General;
      } else
          return TriangleType.NoTriangle;
      
    • 上述代码使用了逻辑或 (||) 运算符,导致只要满足其中一个条件(如 sideA + sideB > sideC),就会误判为可以构成三角形。
    • 正确的判断应改为逻辑与 (&&) 运算符,确保所有三角形不等式都成立时才认为可以构成三角形。
  3. 修复建议

    • 修改 getType 方法中的条件判断逻辑,将逻辑或 (||) 替换为逻辑与 (&&):
      if (this.sideA + this.sideB > this.sideC
              && this.sideA + this.sideC > this.sideB
              && this.sideB + this.sideC > this.sideA) {
          if (this.sideA == this.sideB && this.sideA == this.sideC)
              return TriangleType.Equilateral;
          if (this.sideA == this.sideB || this.sideB == this.sideC || this.sideA == this.sideC)
              return TriangleType.Isosceles;
          if (this.sideA * this.sideA == this.sideB * this.sideB + this.sideC * this.sideC
                  || this.sideB * this.sideB == this.sideA * this.sideA + this.sideC * this.sideC
                  || this.sideC * this.sideC == this.sideA * this.sideA + this.sideB * this.sideB)
              return TriangleType.RightAngled;
          return TriangleType.General;
      } else {
          return TriangleType.NoTriangle;
      }
      
  4. 改进后测试结果

    • 修复代码后重新运行测试用例 getType03,实际结果变为 TriangleType.NoTriangle,与预期结果一致,测试通过。

总结

通过本次测试,我们发现了 Triangle 类中 getType 方法的逻辑错误,并及时进行了修复。修复后,所有测试用例均通过,验证了程序的正确性。同时,这次测试也提醒我们在编写代码时需仔细检查逻辑条件,尤其是涉及多个分支判断的场景。未来可以通过更全面的测试用例覆盖,进一步提高代码的可靠性。

更多推荐