开发者社区 问答 正文

Windows / Jenkins的单元测试通过,但Macbook则失败

我有一个单元测试,该测试成功通过了Windows计算机和Jenkins管道。但是,它在Macbook机器上失败,并带有超时异常。我没有资格共享代码路径,但是正如我提到的,测试可以在其他系统上进行。我将在下面分享尽可能多的细节。

这些是我要导入的库

import com.jcraft.jsch.JSchException;
import org.apache.commons.io.FileUtils;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.http.MediaType;
import org.springframework.test.web.client.ExpectedCount;
import org.springframework.test.web.client.MockRestServiceServer;

import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.stream.Collectors;

import static org.springframework.test.web.client.match.MockRestRequestMatchers.requestTo;
import static org.springframework.test.web.client.response.MockRestResponseCreators.withSuccess;

错误消息是:

java.lang.AssertionError: Timed out waiting for data

    at org.junit.Assert.fail(Assert.java:88)
    at com.XX.oi.engine.smfbulkloader.workers.SmfVbsReaderTest.integrationTest(SmfVbsReaderTest.java:254)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.junit.rules.ExternalResource$1.evaluate(ExternalResource.java:48)
    at org.junit.rules.RunRules.evaluate(RunRules.java:20)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
    at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
    at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:230)
    at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:58)


Process finished with exit code 255

展开
收起
Puppet 2019-12-16 16:00:51 482 分享 版权
阿里云 AI 助理回答

遇到单元测试在Macbook上超时,而在其他系统如Windows和Jenkins上正常通过的情况,可能与以下几个因素有关:

  1. 文件系统差异:MacOS使用的是APFS(Apple File System),而Windows可能使用NTFS或FAT32。这可能导致文件操作(如读写)的性能表现不同,尤其是在处理大量文件或大文件时。

  2. 环境配置差异:MacOS上的Java版本、环境变量、或是相关依赖库的版本可能与其他系统不一致,导致行为差异。特别是像JSch这样的库,它用于SSH连接,可能会因为操作系统网络栈的不同而表现各异。

  3. 资源限制:MacBook相比服务器或虚拟化环境(如Jenkins运行的环境)可能有更严格的资源限制,比如CPU时间片分配、内存大小、磁盘I/O速度等,这些都可能影响到测试的执行效率。

  4. 网络差异:如果测试中涉及网络请求或外部服务调用,MacBook的网络环境(如DNS解析、防火墙设置)可能与其它环境不同,导致延迟增加或请求失败。

  5. 并发和线程管理:MacOS对线程的管理方式可能与其他操作系统有所不同,特别是在并发编程中,这可能会影响到基于CompletableFuture的异步操作或者涉及到多线程的部分。

解决思路:

  • 检查环境一致性:确保MacBook上的Java版本、依赖库版本与Windows和Jenkins环境中的一致。可以使用Maven或Gradle的dependency:tree命令来查看并统一依赖版本。

  • 资源监控:在MacBook上执行测试时,使用系统监视工具(如Activity Monitor)观察CPU、内存、磁盘I/O等资源使用情况,看是否达到瓶颈。

  • 网络诊断:确认MacBook的网络配置没有阻止任何必要的网络通信,尝试禁用防火墙或代理设置进行测试,以排除网络问题。

  • 代码审查:检查测试代码中是否有平台特定的逻辑,尤其是文件路径处理、线程管理和网络请求部分,确保它们具有良好的跨平台兼容性。

  • 调整超时设置:作为临时措施,可以适当增加测试中的超时时间,但这只是治标不治本,应结合上述方法找到根本原因。

  • 日志记录:增加详细的日志记录,尤其是在测试中等待数据的部分,以便更好地理解测试卡住的具体位置和原因。

  • 模拟环境测试:如果可能,尝试在MacBook上搭建一个尽可能接近Jenkins环境的开发环境,包括相同版本的软件和服务,以减少环境差异带来的影响。

通过上述步骤,你应该能够逐步定位并解决测试在MacBook上超时的问题。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答