0

假设我在 FitNesse 套件中有以下类路径定义:

!*> '''Classpath'''
!path /home/stewart/white space test/example-1.0.0-SNAPSHOT/target/test-classes
!path /home/stewart/white space test/example-1.0.0-SNAPSHOT/target/classes
!path /home/stewart/.m2/repository/org/fitnesse/fitnesse/20121220/fitnesse-20121220.jar
*!

我尝试了以下引用或转义形式:

  • 香草空白:!path /home/stewart/white space test/example-1.0.0-SNAPSHOT/target/classes
  • 反斜杠:!path /home/stewart/white\ space\ test/example-1.0.0-SNAPSHOT/target/classes
  • 双反斜杠:!path /home/stewart/white\\ space\\ test/example-1.0.0-SNAPSHOT/target/classes
  • 双引号:!path"/home/stewart/white space test/example-1.0.0-SNAPSHOT/target/classes"
  • 单引号:!path'/home/stewart/white space test/example-1.0.0-SNAPSHOT/target/classes'
  • % 编码:!path /home/stewart/white%20space%20test/example-1.0.0-SNAPSHOT/target/classes
  • 使用 + 的:!path /home/stewart/white+space+test/example-1.0.0-SNAPSHOT/target/classes
  • Unicode 序列:!path /home/stewart/white\u0020space\u0020test/example-1.0.0-SNAPSHOT/target/classes
  • 带有额外反斜杠的 Unicode 序列:!path /home/stewart/white\\u0020space\\u0020test/example-1.0.0-SNAPSHOT/target/classes
  • 通配符:!path /home/stewart/white*space*test/example-1.0.0-SNAPSHOT/target/classes
  • FitNesse wiki 转义:!path !-/home/stewart/white space test/example-1.0.0-SNAPSHOT/target/classes-!

使用香草空格和一些引用的空格,测试根本不运行,我得到错误:

Could not find or load main class space

根据错误日志,FitNesse 正试图用引号转义空格。FitServer它使用以下命令调用:

java -cp fitnesse.jar:"/home/stewart/white space test/example-1.0.0-SNAPSHOT/target/test-classes":"/home/stewart/white space test/example-1.0.0-SNAPSHOT/target/classes":/home/stewart/.m2/repository/org/fitnesse/fitnesse/20121220/fitnesse-20121220.jar fit.FitServer linux-desktop 9123 10

由于某些转义测试确实运行,但它们失败了,因为 FitNesse 无法在类路径上找到固定装置,我认为这意味着空白(+、%20、\u0020 等)的替代品没有被解析为空白,但作为路径文字。

我开始认为在 FitNesse 中不可能做到这一点......


更新:我还尝试使用COMMAND_PATTERNCLASSPATH_PROPERTYFitNesse 变量进行试验,详见有关自定义测试执行的文档


FitNesse 版本为 20121220。

4

1 回答 1

1

好的,所以首先要注意的是,这种现象在 Windows上不会发生。FitNesse 会自动将包含空格的类路径元素用双引号括起来,正如问题中已经指出的那样。FitNesse 生成的命令是:

java -cp fitnesse.jar:"/home/stewart/white space test/example-1.0.0-SNAPSHOT/target/test-classes":"/home/stewart/white space test/example-1.0.0-SNAPSHOT/target/classes":/home/stewart/.m2/repository/org/fitnesse/fitnesse/20121220/fitnesse-20121220.jar fit.FitServer linux-desktop 9123 10

在 Windows 上,这将是:

java -cp fitnesse.jar:"C:\white space test\example-1.0.0-SNAPSHOT\target\test-classes":"C:\white space test\example-1.0.0-SNAPSHOT\target\classes":C:\.m2\repository\org\fitnesse\fitnesse\20121220\fitnesse-20121220.jar fit.FitServer windows-desktop 9123 10

它只是工作!

鉴于 Windows 是在目录(文件夹)名称中通常包含空格的操作系统,我本可以停在那里;但我想更深入地挖掘,因为您偶尔会在类 Unix 系统上的目录名称中出现空格(MacOS 会浮现在脑海中。)

深入研究 FitNesse 源代码,我们感兴趣的类是fitnesse.testsystems.CommandRunner. 在方法asynchronousStart()上它使用Java的Runtime.exec()方法。

Runtime.exec()有重载的方法。在某些情况下,命令是 aString被解析为 a java.util.StringTokenizer。在其他情况下,命令已经是 aString[]并且不会被进一步解析。

换句话说,这失败了:

String cmd = "java -cp fitnesse.jar:\"/home/stewart/white space test/example-1.0.0-SNAPSHOT/target/test-classes\":\"/home/stewart/white space test/example-1.0.0-SNAPSHOT/target/classes\":/home/stewart/.m2/repository/org/fitnesse/fitnesse/20121220/fitnesse-20121220.jar fit.FitServer linux-desktop 9123 10";
String[] env = new String[]{};
Runtime.getRuntime().exec(cmd, env);

虽然这有效:

String[] cmd = new String[] {
    "java",
    "-cp",
    "fitnesse.jar:\"/home/stewart/white space test/example-1.0.0-SNAPSHOT/target/test-classes\":\"/home/stewart/white space test/example-1.0.0-SNAPSHOT/target/classes\":/home/stewart/.m2/repository/org/fitnesse/fitnesse/20121220/fitnesse-20121220.jar",
    "fit.FitServer",
    "linux-desktop",
    "9123",
    "10";
};
String[] env = new String[]{};
Runtime.getRuntime().exec(cmd, env);

结论:这是 FitNesse 中的一个错误。


更新:这是从 FitNesse 版本 20140623 开始修复的。

于 2013-06-26T12:44:55.893 回答