【问题标题】:Cucumber Exception Failed to create directory黄瓜异常创建目录失败
【发布时间】:2019-04-26 00:47:41
【问题描述】:

当我运行 MainRunner 类作为响应时,我在控制台中收到如下错误消息。我确实为文件夹设置了权限。

这是我的步骤类:

package CucumberFramework.steps;

import cucumber.api.java.en.Given;

import cucumber.api.java.en.Then;

import cucumber.api.java.en.When;



public class LoginSteps {

@Given("^User navigate to stackoverflow webstie$")

public void user_navigate_to_stackoverflow_webstie() throws Throwable {

   System.out.println("user_navigate_to_stackoverflow_webstie");

}



@Given("^User clicks on the login button$")

public void user_clicks_on_the_login_button() throws Throwable {

    System.out.println("user_clicks_on_the_login_button");

}



@Given("^User enters valid username$")

public void user_enters_valid_username() throws Throwable {

System.out.println("user_enters_valid_username");

}



@Given("^User enters valid password$")

public void user_enters_valid_password() throws Throwable {

System.out.println("user_enters_valid_password");

}

@When("^User clicks again on the login button$")

public void user_clicks_again_on_the_login_button() throws Throwable {

System.out.println("user_clicks_again_on_the_login_button");

}



@Then("^User should be taken to the sucsfull login page$")

public void user_should_be_taken_to_the_sucsfull_login_page() throws Throwable {

System.out.println("user_should_be_taken_to_the_sucsfull_login_page");

}

@Given("^User navigate to stackoverflow webstie(\\d+)$")

public void user_navigate_to_stackoverflow_webstie2(int arg1) throws Throwable {

System.out.println("user_navigate_to_stackoverflow_webstie2");

}



@Given("^User clicks on the login button(\\d+)$")

public void user_clicks_on_the_login_button2(int arg1) throws Throwable {

System.out.println("user_clicks_on_the_login_button2");

}



@Given("^User enters valid username(\\d+)$")

public void user_enters_valid_username2(int arg1) throws Throwable {

System.out.println("user_enters_valid_username2");

}



@Given("^User enters valid password(\\d+)$")

public void user_enters_valid_password2(int arg1) throws Throwable {

System.out.println("user_enters_valid_password2");

}



@When("^User clicks again on the login button(\\d+)$")

public void user_clicks_again_on_the_login_button2(int arg1) throws Throwable {

System.out.println("user_clicks_again_on_the_login_button2");

}



@Then("^User should be taken to the sucsfull login page(\\d+)$")

public void user_should_be_taken_to_the_sucsfull_login_page2(int arg1) throws Throwable {

System.out.println("user_should_be_taken_to_the_sucsfull_login_page2");

}

}

我还查看了目标文件夹的权限,并确保为所有用户授予权限。我使用的是 Windows 10 专业版。我也尝试在管理员模式下运行 Eclipse,但也没有用。

这是我的 Pom.xml https://pastebin.com/ad2qyGRH

我也尝试了以下方法:

正在运行:Eclipse 菜单 Project > Clean...

但没有快乐。请问有谁知道是什么原因造成的?

亲切的问候

【问题讨论】:

  • 您能检查一下target/cucumber 不是文件吗?

标签: eclipse cucumber pom.xml file-permissions


【解决方案1】:

这通常发生在插件写入冲突路径时。 例如:json:target/cucumber/report.json, html:target/cucumber

要解决此问题,请确保路径不发生冲突或冲突。 例如:json:target/cucumber/report.json, html:target/cucumber/report.html。请注意,report.jsonreport.html 都是文件(带有扩展名)。如果您将其中至少一个设为目录(不带扩展名),则会在运行时引发异常。

【讨论】:

    【解决方案2】:

    当一个名为输出目录 (target/cucumber) 的文件已经存在时,会发生异常cucumber.runtime.CucumberException: java.io.IOException: Failed to create directory ...

    假设如下结构

    src/test/java/runner/TestRunner.java
    pom.xml
    

    pom.xml 依赖项

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <version.cucumber>2.0.0</version.cucumber>
    </properties>
    <dependencies>
        <dependency>
            <groupId>io.cucumber</groupId>
            <artifactId>cucumber-java</artifactId>
            <version>${version.cucumber}</version>
        </dependency>
        <dependency>
            <groupId>io.cucumber</groupId>
            <artifactId>cucumber-junit</artifactId>
            <version>${version.cucumber}</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
    

    TestRunner.java

    package runner;
    import org.junit.runner.RunWith;
    import cucumber.api.CucumberOptions;
    import cucumber.api.junit.Cucumber;
    
    @RunWith(Cucumber.class)
    @CucumberOptions(plugin = { "html:target/cucumber" })
    public class TestRunner {
    }
    

    复制步骤

    $ mvn clean test-compile
    $ echo "some text" > target/cucumber
    

    现在target/cucumber 文件存在,运行测试

    $ mvn test
    

    失败了

    Caused by: cucumber.runtime.CucumberException: java.io.IOException: Failed to create directory /tmp/cuke.test/target/cucumber
        at cucumber.runtime.formatter.HTMLFormatter.createReportFileOutputStream(HTMLFormatter.java:520)
        at cucumber.runtime.formatter.HTMLFormatter.createJsOut(HTMLFormatter.java:510)
        at cucumber.runtime.formatter.HTMLFormatter.<init>(HTMLFormatter.java:123)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    

    基于上述堆栈跟踪中的行号和 OP 的屏幕截图。看来 OP 使用 Cucumber 版本2.0.0-SNAPSHOT。因为reportFileOutputStream 类中的方法HTMLFormatter 被重命名为createReportFileOutputStream(SHA1:486b82cb9)。在 Cucumber 版本2.0.0 发布之前。

    编辑: 一些更详细的解释。主要问题是插件试图创建一个同名的目录条目target/cucumber

    • html - 将创建一个目录 target/cucumber
    • json - 将创建一个文件 target/cucumber

    如上所述,当一个目录应该被创建并且具有相同的文件已经存在时,会抛出异常Failed to create directory

    它可以通过TestRunner.java中的CucumberOptions复制。

    @CucumberOptions(plugin = {"json:target/cucumber", "html:target/cucumber"})
    cucumber.runtime.CucumberException: cucumber.runtime.CucumberException: \
        java.io.IOException: Failed to create directory /.../target/cucumber
    

    注意: 在 OP 的代码中,插件的顺序不是json - html,而是html - json。因此上面的 sn-p 只使用了html 插件,并在运行测试之前创建了文件target/cucumber

    按照 OP 屏幕截图中所示的相同顺序使用插件会引发不同的异常。

    @CucumberOptions(plugin = {"html:target/cucumber", "json:target/cucumber"})
    cucumber.runtime.CucumberException: java.io.FileNotFoundException: \
        target/cucumber (Is a directory)
    

    根据用于重现冲突的步骤,插件顺序和屏幕截图中的异常不匹配。

    更改 json 插件 ("json:target/cucumber.json") 的输出文件名很可能会解决此问题。

    【讨论】:

    • 你能提供一个解决这个问题的方法吗?谢谢
    • @Ryan 我添加了更详细的解释和最可能的解决方案。
    【解决方案3】:

    根据我的发现,plugin 对象似乎正在尝试创建 2 个名为“黄瓜”的目录,而您想要的对象是创建 一个目录和一个文件,名为黄瓜。这是您的对象的样子:

    plugin = {
        "pretty", 
        "html:target/cucumber", //this is telling cucumber to create a folder called cucumber
        "json:target/cucumber", //this is also telling cucumber to create a folder called cucumber 
                                //even though you just need a file called cucumber.json
        "com.cucumber.listener.ExtentCucumberFormatter: target/report.html" 
        //there is an unnecessary white space before "target" that is causing another issue
    }
    

    你想要做的是:

    plugin = {
        "pretty", 
        "html:target/cucumber", //create a folder called cucumber
        "json:target/cucumber.json", 
        //Notice the corresponding file extension (.json) telling cucumber to create a file
        "com.cucumber.listener.ExtentCucumberFormatter:target/report.html"
        //Notice I remove the white space at :target/report.html
    }
    

    现在代码正在创建一个名为 cucumber 的 文件夹(这将包含一个显示测试结果的基本网页)和一个名为 cucumber.json 的 文件(这将是相同的测试结果,但为 json 格式)

    别忘了删除那个空白! 然后,该空白区域会创建一个名为“target”的单独文件夹(以空白开头),并将 report.html 文件放入其中,而不是与其余的报告工件一起放置。

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2020-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-03
      • 2017-09-23
      相关资源
      最近更新 更多