我的JUnit测试存在哪些遗漏?附相关测试代码片段
从你给出的代码片段来看,有几个明显的遗漏和可以优化的点,我帮你逐一梳理:
核心的断言逻辑缺失
JUnit测试的本质是验证行为是否符合预期,你现在只调用了旋转图片的方法并把结果赋值给rotatedImageTestResult,但没有任何代码来验证这个结果是否正确。比如你可以:- 对比旋转后图片的尺寸是否符合预期(比如旋转90度后宽高互换)
- 检查特定像素点的颜色值是否和预期一致
- 如果有预先准备好的"正确旋转后的图片",可以逐像素对比或者用图片哈希值校验
示例断言代码(以JUnit 5为例):
assertEquals(testImage.getHeight(), rotatedImageTestResult.getWidth()); assertEquals(testImage.getWidth(), rotatedImageTestResult.getHeight()); // 或者更细致的像素校验逻辑未完成的方法调用
代码里的rotatedImageTestResult = g...明显是未完成的代码,这里的g应该是你初始化的generator实例吧?你需要补全调用generator的旋转方法,比如generator.rotateImage(testImage, 90)之类的,否则代码根本无法编译运行。静态资源初始化的最佳实践缺失
testImage是静态变量,但你在@Before方法里初始化它——@Before会在每个测试方法执行前都运行一次,这意味着图片会被重复加载多次,完全没必要。你应该把静态资源的初始化放在@BeforeClass(JUnit 4)或者@BeforeAll(JUnit 5)注解的静态方法里,这样图片只会加载一次,提升测试效率:@BeforeClass public static void setUpClass() throws Exception { File inputFile = new File("src/test/resource/picture.jpg"); testImage = ImageIO.read(inputFile); }可选的资源清理(如果需要)
如果你的Generator类或者图片操作会占用一些需要手动释放的资源(比如文件流),可以添加@After(JUnit4)或@AfterEach(JUnit5)方法来做清理工作。不过对于BufferedImage来说,JVM的垃圾回收通常会处理,但养成这个习惯会让测试代码更健壮。测试方法命名可以更清晰
虽然testRotateImageRotateImage是合法的命名,但遵循[动作]_[预期结果]的命名规范会让测试代码更易读,比如改成testRotateImage_90Degrees_SwapsWidthAndHeight。
内容的提问来源于stack exchange,提问作者user9727774

