stderr 和 stdout 被 testcontainers-java 中的换行符随机中断

Posted

技术标签:

【中文标题】stderr 和 stdout 被 testcontainers-java 中的换行符随机中断【英文标题】:Stderr and stdout interrupted randomly by newline chars in testcontainers-java 【发布时间】:2021-06-07 10:09:14 【问题描述】:

我正在使用Testcontainers 运行 Junit5 测试,在测试中我使用 Maven 启动一个映像来执行一些命令。

例如,我创建了一个测试,只是为了将mvn 版本打印到标准输出:

        this.net = Network.newNetwork();
       
        this.clientContainer = new GenericContainer<>("maven:3.6.3-jdk-11")
            .withWorkingDirectory("/w")
            .withClasspathResourceMapping("maven-settings.xml", "/w/settings.xml", BindMode.READ_ONLY)
            .withStartupTimeout(Duration.ofSeconds(1))
            .withNetwork(net)
            .withCommand("tail", "-f", "/dev/null");

        this.clientContainer.start();

        ExecResult res  =this.clientContainer.execInContainer(
                StandardCharsets.UTF_8,
                "mvn", "-B", "-version"
            );

        System.out.println("stdout: " + res.getStdout());

但输出看起来很奇怪,因为它在 stdout 中有太多换行符:

stdout: Apache
 M
a
v
en
 3.6.
3
 (cec
e
d
d
3
4
3
0
0
2
6
9
6
d
0
a
b
b
5
0
b
3
2
b
5
4
1
b
8
a
6
b
a
2
8
8
3
f
)


M
a
v
e
n
 
h
o
m
e
:
 
/
u
s
r
/
s
h
a
r
e
/
m
a
v
e
n


J
a
v
a
 
v
e
r
s
i
o
n
:
 
1
1
.
0
.
1
0
,
 
v
e
n
d
o
r
:
 
O
r
a
c
l
e
 
C
o
r
p
o
r
a
t
i
o
n
,
 
r
u
n
t
i
m
e
:
 
/
u
s
r
/
l
o
c
a
l
/
o
p
e
n
j
d
k
-
1
1


D
e
f
a
u
l
t
 
l
o
c
a
l
e
:
 
e
n
,
 
p
l
a
t
f
o
r
m
 
e
n
c
o
d
i
n
g
:
 
U
T
F
-
8


O
S
 
n
a
m
e
:
 
"
l
i
n
u
x
"
,
 
v
e
r
s
i
o
n
:
 
"
5
.
1
0
.
8
_
1
"
,
 
a
r
c
h
:
 
"
a
m
d
6
4
"
,
 
f
a
m
i
l
y
:
 
"
u
n
i
x
"

这可能是什么问题?我尝试使用和不使用 -B 选项运行,尝试了其他 Maven 命令,并通过指定字符集编码进行了测试。

【问题讨论】:

“它在我的机器上工作......”(C)理论上不应该与Testcontainers相关,除非你使用一些非常旧的版本。 如果您尝试在调试模式下评估 execResult.getStdout() 会怎样? 是来自普通控制台的输出还是来自 IDEA IntellIJ(输出)?此外,问题是:您为什么喜欢在 JUnit 5 测试中运行 Maven?除此之外,你为什么需要tail... 命令? @khmarbaise 控制台运行mvn verify 和idea 测试运行是一样的。在测试中运行 maven 是我的业务案例 - 我正在测试可以返回 maven 工件的 Web 服务。 Tailf 是一种让容器保持活动直到停止的解决方法(它在 beforeEach 方法中启动,每个测试方法执行不同的命令) @VitalyChura 它有相同的换行符 【参考方案1】:

这是 Tescontainers 库本身的 bug。不过,在最新版本1.15.2(fix PR)中已修复,所以请尝试升级Testcontainers。

我能够使用1.15.1 版本重现您的问题,但不再使用1.15.2

【讨论】:

以上是关于stderr 和 stdout 被 testcontainers-java 中的换行符随机中断的主要内容,如果未能解决你的问题,请参考以下文章

使用系统命令将stdout和stderr输出重定向到文件在perl中不起作用[重复]

发送 stderr/stdout 消息到函数并捕获退出信号

使用 Autohotkey 读取 StdErr 和 StdOut

stderr和stdout的区别

使用python sh模块,如何保存组合的stdout和stderr?

输出重定向是不是按顺序写入 stdout 和 stderr 信息?