从构建过程中分离Selenium测试

时间:2012-07-29 05:11:28

标签: maven selenium build continuous-integration

我有一个问题可能对你们所有人都非常微不足道,我只是想确保我抓住这个概念。 我做了很多研究和阅读SO post),我仍然有点困惑,所以我转向你的专家!

在下面的文章中,作者提到了一种常见的做法,即在构建时将硒测试与单元测试分开。他们说,selenium测试不应该在每个构建上运行,它们应该在CI服务器上运行而不是作为maven构建的一部分,因此他们将maven配置为跳过selenium测试,然后在集成阶段运行。

我有点理解,但我并不熟悉构建生命周期以及为什么你必须按照作者的方式进行设置。

是否有人能够提供一个简单的解释(或提供阅读材料),为什么你想要做那些文章中提到的内容?我开始大量使用硒,并希望更好地理解这些概念。如果这是微不足道的话,请再次抱歉,我不会征求辩论,争论或民意调查。

非常感谢!

http://www.weblogism.com/item/334/integration-tests-with-cucumber-jvm-selenium-and-maven http://www.lagerweij.com/2011/08/24/setting-up-selenium-with-maven http://blog.tfnico.com/2007/09/continous-web-testing-with-selenium_16.html http://developershood.blogspot.com/2009/10/using-selenium-and-maven-for-junit.html

2 个答案:

答案 0 :(得分:1)

仅分离和运行单元测试的原因是:

  1. 需要在硒测试之前运行单元测试 - 以简化故障推理。
  2. 这些类型的测试需要maven插件配置中的不同设置 - 并行测试运行,排序,系统属性,JVM选项等。
  3. Selenium测试是端到端的,需要大量的配置和部署工作,重置应用程序状态(清除数据库,启动和停止app服务器) - 这些工作在所有开发和登台环境中都不能轻松完成
  4. Maven有一系列用于分离集成测试步骤的阶段,还有一些配置文件允许在单个位置收集硒测试配置。

    以下是我们使用selenium进行端到端测试的示例(解压缩和运行脚本从头开始设置数据库,启动应用服务器,运行测试,停止应用服务器,验证并报告测试结果):

    <profile>
        <id>selenium</id>
        <dependencies>
            <dependency>
                <groupId>com.thenewmotion</groupId>
                <artifactId>msp-solveconnector</artifactId>
                <version>${project.version}</version>
                <classifier>sql-install</classifier>
                <type>zip</type>
                <scope>test</scope>
            </dependency>
        </dependencies>
        <build>
            <pluginManagement>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-dependency-plugin</artifactId>
                        <executions>
                            <execution>
                                <id>unpack-dependencies</id>
                                <phase>package</phase>
                                <goals>
                                    <goal>unpack-dependencies</goal>
                                </goals>
                                <configuration>
                                    <includeGroupIds>com.thenewmotion</includeGroupIds>
                                    <includeArtifactIds>msp-solveconnector</includeArtifactIds>
                                    <includeClassifiers>sql-install</includeClassifiers>
                                    <includeTypes>zip</includeTypes>
                                    <includes>**/*.*</includes>
                                    <outputDirectory>${project.build.directory}</outputDirectory>
                                    <overWriteReleases>false</overWriteReleases>
                                    <overWriteSnapshots>true</overWriteSnapshots>
                                </configuration>
                            </execution>
                        </executions>
                    </plugin>
                    <plugin>
                        <groupId>org.codehaus.mojo</groupId>
                        <artifactId>sql-maven-plugin</artifactId>
                        <dependencies>
                            <dependency>
                                <groupId>mysql</groupId>
                                <artifactId>mysql-connector-java</artifactId>
                                <version>5.1.16</version>
                            </dependency>
                        </dependencies>
                        <executions>
                            <execution>
                                <id>create-db</id>
                                <phase>pre-integration-test</phase>
                                <goals>
                                    <goal>execute</goal>
                                </goals>
                                <configuration>
                                    <driver>com.mysql.jdbc.Driver</driver>
                                    <url>jdbc:mysql://localhost</url>
                                    <username>${msp.db.user}</username>
                                    <password>${msp.db.password}</password>
                                    <orderFile>ascending</orderFile>
                                    <fileset>
                                        <basedir>${project.build.directory}/db</basedir>
                                        <includes>
                                            <include>1_drop_database.sql</include>
                                            <include>2_create_database.sql</include>
                                            <include>3_create_tables.sql</include>
                                            <include>4_create_views.sql</include>
                                            <include>5_create_foreign_keys.sql</include>
                                            <include>6_data.sql</include>
                                        </includes>
                                    </fileset>
                                </configuration>
                            </execution>
                        </executions>
                    </plugin>
                    <plugin>
                        <groupId>org.mortbay.jetty</groupId>
                        <artifactId>jetty-maven-plugin</artifactId>
                        <configuration>
                            <stopKey>foo</stopKey>
                            <stopPort>8088</stopPort>
                            <connectors>
                                <connector implementation="org.eclipse.jetty.server.nio.SelectChannelConnector">
                                    <port>${msp.port}</port>
                                    <maxIdleTime>60000</maxIdleTime>
                                </connector>
                            </connectors>
                        </configuration>
                        <executions>
                            <execution>
                                <id>start-jetty</id>
                                <phase>pre-integration-test</phase>
                                <goals>
                                    <goal>run</goal>
                                </goals>
                                <configuration>
                                    <daemon>true</daemon>
                                </configuration>
                            </execution>
                            <execution>
                                <id>stop-jetty</id>
                                <phase>post-integration-test</phase>
                                <goals>
                                    <goal>stop</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-failsafe-plugin</artifactId>
                        <version>2.12</version>
                        <configuration>
                            <systemPropertyVariables>
                                <msp.user>${msp.user}</msp.user>
                                <msp.password>${msp.password}</msp.password>
                                <msp.baseUrl>${msp.baseUrl}</msp.baseUrl>
                                <webdriver.type>${webdriver.type}</webdriver.type>
                                <webdriver.chrome.driver>${webdriver.chrome.driver}</webdriver.chrome.driver>
                            </systemPropertyVariables>
                            <includes>
                                <include>**/*FT.class</include>
                            </includes>
                        </configuration>
                    </plugin>
                </plugins>
            </pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-dependency-plugin</artifactId>
                </plugin>
                <plugin>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>sql-maven-plugin</artifactId>
                </plugin>
                <plugin>
                    <groupId>org.mortbay.jetty</groupId>
                    <artifactId>jetty-maven-plugin</artifactId>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-failsafe-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    </profile>
    

答案 1 :(得分:1)

当我写下你提到的其中一篇文章时,我想我应该补充一点。

分离硒测试还有另一个原因。硒测试。开发人员不需要需要多分钟才能运行的构建。他希望从他的单元测试中获得快速反馈。 Selenium测试可能会以较低的频率运行,比如在将代码提交/推送到版本控制之前。

出于同样的原因,您可能会在构建服务器上设置不同的构建作业,每次检查都会运行非UI测试,之后可能会运行UI测试,或者可能以较低的频率运行(每个小时?每晚?)取决于他们运行多长时间,以及你能负担得起的基础设施。