[ 
https://issues.apache.org/jira/browse/SUREFIRE-1372?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16285278#comment-16285278
 ] 

ASF GitHub Bot commented on SUREFIRE-1372:
------------------------------------------

Github user mpkorstanje commented on the issue:

    https://github.com/apache/maven-surefire/pull/150
  
     > How is Description constructed now by Cucumber?
    
    Executing cucumber while using JUnit creates a tree of Descriptions like so:
    
    ```
    Cucumber
     |- Feature 1
     |  | - Scenario 1
     |  | - Scenario 2
     |  | - Scenario 3
     |- Feature 2
     |  | - Scenario 4
     |  | - Scenario 5
     |  | - Scenario 6
    ```
    
    The root description describes the [Cucumber JUnit 
runner](https://github.com/cucumber/cucumber-jvm/blob/v2.2.0/junit/src/main/java/cucumber/api/junit/Cucumber.java)
 and is created in [JUnits 
ParentRunner](https://github.com/junit-team/junit4/blob/r4.12/src/main/java/org/junit/runners/ParentRunner.java#L349).
 using 
[Description.createSuitDescription(String)](https://github.com/junit-team/junit4/blob/r4.12/src/main/java/org/junit/runner/Description.java#L44).
 This results in a `Description` with `fUniqueId` equal to the name of  the 
runner. This is always the fqn of the JUnit test annotated with 
`@RunWith(Cucumber.class)`.
    
    The Feature Descriptions are created in the 
[FeatureRunner](https://github.com/cucumber/cucumber-jvm/blob/v2.2.0/junit/src/main/java/cucumber/runtime/junit/FeatureRunner.java#L44)
 using [Description.createSuitDescription(String, 
Serializable)](https://github.com/junit-team/junit4/blob/r4.12/src/main/java/org/junit/runner/Description.java#L57).
 The name is name of the, which is used for display purposes but otherwise 
irrelevant. For the extra `Serializable` parameter we provide a 
[FeatureId](https://github.com/cucumber/cucumber-jvm/blob/v2.2.0/junit/src/main/java/cucumber/runtime/junit/FeatureRunner.java#L105).
 This results in a `Description` with `fUniqueId` equal to the `FeatureId` of 
that feature. This `FeatureId` contains the features uri which will satisfy 
equality between different (repeated) executions of the same test class.
    
    The same reasoning applies to the creation of the scenario description. 
Each `Description` is created with a `PickleId` that contains the uri of that 
scenario. The actual implementation is slightly more complex so I'd like to 
omit it for brevity.
    
    As such we end up with:
    
    ```
    Cucumber           Description.fUniqueId = 
"com.example.package.of.my.RunnerTest"
     |- Feature 1      Description.fUniqueId = 
FeatureId("path/to/my/cucumber.feature1")
     |  | - Scenario 1 Description.fUniqueId = 
PickleId("path/to/my/cucumber.feature1:1")
     |  | - Scenario 2 Description.fUniqueId = 
PickleId("path/to/my/cucumber.feature1:2")
     |  | - Scenario 3 Description.fUniqueId = 
PickleId("path/to/my/cucumber.feature1:3")
     |- Feature 2      Description.fUniqueId = 
FeatureId("path/to/my/cucumber.feature2")
     |  | - Scenario 4 Description.fUniqueId = 
PickleId("path/to/my/cucumber.feature2:1")
     |  | - Scenario 5 Description.fUniqueId = 
PickleId("path/to/my/cucumber.feature2:2")
     |  | - Scenario 6 Description.fUniqueId = 
PickleId("path/to/my/cucumber.feature2:3")
    ```
    
    > Does it contain the real method name or it is a scenario text?
    
    No. It does not contain a method name. A scenario does not have a 
one-to-one mapping with any methods. Instead we use uri's to reference a 
scenario. Note that if we were to rewrite the above suite of features to a 
suite of JUnit tests, the underlying `Description` tree would have a similar 
identity.
    
    ```
    TestSuite          Description.fUniqueId = 
"com.example.package.of.my.TestSuite"
     |- Feature 1      Description.fUniqueId = 
"com.example.package.of.my.Feature1"
     |  | - Scenario 1 Description.fUniqueId = 
"scenario1(com.example.package.of.my.Feature1)"
     |  | - Scenario 2 Description.fUniqueId = 
"scenario2(com.example.package.of.my.Feature1)"
     |  | - Scenario 3 Description.fUniqueId = 
"scenario3(com.example.package.of.my.Feature1)"
     |- Feature 2      Description.fUniqueId =  
"com.example.package.of.my.TestSuite"
     |  | - Scenario 4 Description.fUniqueId = 
"scenario1(com.example.package.of.my.Feature2)"
     |  | - Scenario 5 Description.fUniqueId = 
"scenario2(com.example.package.of.my.Feature2)"
     |  | - Scenario 6 Description.fUniqueId = 
"scenario3(com.example.package.of.my.Feature2)"
    ```


> Rerunning failing tests fails in combination with 
> Description#createSuiteDescription
> ------------------------------------------------------------------------------------
>
>                 Key: SUREFIRE-1372
>                 URL: https://issues.apache.org/jira/browse/SUREFIRE-1372
>             Project: Maven Surefire
>          Issue Type: Bug
>          Components: Maven Surefire Plugin
>    Affects Versions: 2.20
>            Reporter: M.P. Korstanje
>            Assignee: Tibor Digana
>             Fix For: 2.21.1
>
>
> When using surefire to rerun failing tests created by a Runner that uses 
> {noformat}Description#createSuiteDescription{noformat} with a human readable 
> name rather then a class name the following stack trace occurs:
> {code}
> org.apache.maven.surefire.testset.TestSetFailedException: Unable to create 
> test class 'Scenario: Fail when running'
>         at 
> org.apache.maven.surefire.junit4.JUnit4Provider.executeFailedMethod(JUnit4Provider.java:385)
>         at 
> org.apache.maven.surefire.junit4.JUnit4Provider.executeWithRerun(JUnit4Provider.java:292)
>         at 
> org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:238)
>         at 
> org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:161)
> Caused by: java.lang.ClassNotFoundException: Scenario: Fail when running
>         at 
> org.apache.maven.surefire.junit4.JUnit4Provider.executeFailedMethod(JUnit4Provider.java:379)
>         at 
> org.apache.maven.surefire.junit4.JUnit4Provider.executeWithRerun(JUnit4Provider.java:292)
>         at 
> org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:238)
>         at 
> org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:161)
> {code}



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Reply via email to