无法通过TeamCity运行某些功能文件标记

Mat*_*att 8 teamcity continuous-integration cucumber maven continuous-deployment

我有各种Cucumber功能文件,每个文件都有多个场景.每个要素文件用于系统的不同组件.

我有各种运行器,每个组件一个,因此每个功能文件一个.

下面是我的一些项目结构,您可以在其中查看包含_Run_AllTest.java在Resources文件夹中包含我的功能的运行程序.

Test
????java
?   ?
?   ????stepdefs
?   ?   ????MOPStepDefs
?   ?   ?       ADAWA_Run_AllTest.java
?   ?   ?       DPL_Run_AllTest.java
?   ?   ?       MOPStepDefs.java
?   ?   ?       MOP_Run_AllTest.java
?   ?   ?
?   ?   ????MOSStepDefs
?   ?   ?       MOSStepDefs.java
?   ?   ?       MOS_Run_AllTest.java
?   ?   ?       PAR_Run_AllTest.java
?   ?   ?       RenewalApproachingPAR_Run_AllTest.java
?   ?   ?
?   ?   ????OAStepDefs
?   ?   ?       OAStepDefs.java
?   ?   ?       OA_Run_AllTest.java
?   ?   ?
?   ?   ????TPOSStepDefs
?   ?           TPOStepDefs.java
?   ?           TPOS_Run_AllTest.java
?   ?
?   ????Testconfig
?           TestMDABDDConfig.java
?
????Resources
    ????MOP Features
    ?       ADAWADentalOnlinePayments.feature
    ?       DPLDentalOnlinePayments.feature
    ?       MemberOnlinePayments.feature
    ?
    ????MOS Features
    ?       MemberOnlineService.feature
    ?       PolicyAmendRequest.feature
    ?       RenewalApproachingPAR.feature
    ?
    ????Online Apps Features
    ?       OnlineApplications.feature
    ?
    ????TPOS Features
            AllTPOS.feature
Run Code Online (Sandbox Code Playgroud)

举一个我正在使用的标签的例子,A​​llTPOS.feature将在我自动化的功能上包含@AutomatedTPOS的标签.还有一些带有@Manual的标签.我的这个功能的跑步者看起来像这样:

package stepdefs.TPOSStepDefs;

import cucumber.api.CucumberOptions;
import cucumber.api.junit.Cucumber;
import org.junit.runner.RunWith;

@RunWith(Cucumber.class)
@CucumberOptions(
        plugin = {
                "html:C:\\Projects\\BDD\\Online Framework\\Reporting\\TPOS Features",
                "pretty"
        },
        features = "src\\test\\Resources\\TPOS Features\\AllTPOS.feature",
        tags = {"~@Manual"}
)


public class TPOS_Run_AllTest {
}
Run Code Online (Sandbox Code Playgroud)

我在我的.pom文件中包含以下内容,其中我声明包括我的所有运行器文件,即 **/*_Run_All*.java

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.22.0</version>
        <configuration>
            <testSourceDirectory>\src\test\java\</testSourceDirectory>
            <!--<testClassesDirectory>C:/TeamCity/buildAgent2nd/work/classes/</testClassesDirectory>-->
             <includes>
                <include>**/*_Run_All*.java</include>
            </includes>
            <!-- <excludes> <exclude>**/*RunCukesTest.java</exclude> </excludes> -->
        </configuration>
    </plugin>
Run Code Online (Sandbox Code Playgroud)

如果我通过命令行运行maven命令,mvn clean test -Dcucumber.options="--tags @AutomatedTPOS"那么一切似乎都按预期工作,只有@AutomatedTPOS标记的功能才能运行.

所以我的问题是当我们通过TeamCity尝试这个时.CI Developer已将JVM命令行参数添加-Dmaven.multiModuleProjectDirectory="%mavenhome%" "-Dcucumber.options=--tags @AutomatedTPOS"到TeamCity中,但是当我们从TeamCity运行时,它将运行每个功能,而不仅仅是我们希望的@AutomatedTPOS.

如果没有看到@AutomatedTPOS功能仅在我们从TeamCity运行时运行,我做错了什么?

Edit1:如果我从POM中删除以下内容

             <includes>
                <include>**/*_Run_All*.java</include>
            </includes>
Run Code Online (Sandbox Code Playgroud)

然后我通过命令运行我的场景mvn clean test -Dcucumber.options="--tags @AutomatedTPOS"然后我可以看到事情按预期工作,即只运行@AutomatedTPOS场景.但是,如果我然后通过TeamCity启动此构建,则此时不会运行任何测试.当POM中的这一行存在时,所有场景都在运行.

当我通过TeamCity查看构建日志时,我可以看到命令行包含 "-Dcucumber.options=\"--tags @AutomatedTPOS\""

Mat*_*att 4

在 CI 开发人员的帮助下,我们找到了答案。

在 TeamCity 中, 的参数"-Dcucumber.options=--tags @AutomatedTPOS"应该位于“其他 Maven 命令行参数:”字段中,而不是“JVM 命令行参数:”字段中。

我还从 POM 中删除了以下内容,因为这没有任何意义。

         <includes>
            <include>**/*_Run_All*.java</include>
        </includes>
Run Code Online (Sandbox Code Playgroud)