Continuous Integration with Selenium
I have seen a lot of queries from people who basically want to know how to blend Selenium, Maven, and hudson to achieve continous integration.
So I thought I would write up my own recipe which has worked for me.
The ingredients that you would need for this recipe .
- Maven Standalone : A standalone installation of maven. (You can refer here for instructions on how to get it done )
- An IDE : I have used only eclipse. As a popular saying goes “a known devil is better than the unknown angel” I am sticking to eclipse. You can download a copy of eclipse from here
- Maven plugin : The newer versions of eclipse by default comes bundled with the maven plugin. But if you already have an eclipse copy with you and just want to add the maven plugin, you can add it from here
- TestNG plugin : You can add TestNG plugin to your eclipse installation from here. If you are not very familiar with adding plugins to eclipse, you can refer here
- Jenkins/Hudson instance for your continuous integration runs. For setting up hudson you can refer here
So lets start, now that we have our environment all setup and ready.
To begin with lets create a simple maven project from the command line. (for detailed help, you can refer here )
Let us first start by creating a simple maven project, from the command line. You would need to ensure you have maven available in your local machine.
Run the command :
1
2
|
mvn archetype:generate -DgroupId=organized.chaos -DartifactId=insanity -DpackageName=organized.chaos.insanity -Dversion=1.0-SNAPSHOT |
So here maven would create a directory named “insanity” which represents the root directory of my new maven project.
Once the project is created, create a folder under src/test and call it as “resources”.
Now lets take a look at the folder structure of our empty project (the folder name would be ‘insanity’)
1
2
3
4
5
6
7
8
9
10
11
12
|
$ find . - type d -print | sed -e 's;[^/]*/;|____;g;s;____|; |;g' . |____src | |____main | | |____java | | | |____organized | | | | |____chaos | |____test | | |____java | | | |____organized | | | | |____chaos | | |____resources |
(I found this cool unix command from here)
Lets go ahead and add TestNG and selenium as dependencies to our pom file. Open up the pom file in eclipse or any other editor of your choice and add the below :
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.4</version>
</dependency>
<!-- Adding Selenium dependency -->
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-server</artifactId>
<version>2.21.0</version>
</dependency>
So, lets add a <build> section to our pom file, and then lets add the compiler plugin as below:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
Now go ahead and add all of your TestNG tests as desired and then create a suite file out of them. The simplest way of creating a suite file out of your TestNG tests from within eclipse would be to
multi-select them (using shift/ctrl + click) and then right click and say convert to TestNG.
The TestNG plug-in should give you a nice IDE using which you can create your suite file on the fly.
So our suite file is ready, and we need to just let maven know, that it has to pick up our suite file, whenever the test phase is invoked within maven.
This is where we leverage surefire-plugin. You can read more about surefire-plugin and all the options that it comes with here
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.6</version>
<configuration>
<!-- We use a property here, because we want the ability to change the suite file on the fly
during runs '-DsuiteXmlFile=src/test/resources/testng-sample.xml' -->
<suiteXmlFiles>
<suiteXmlFile>${suiteXmlFile}</suiteXmlFile>
</suiteXmlFiles>
<!-- Build with '-DskipTests=true' to bypass test execution @ build time Default: false -->
<skipTests>${skipTests}</skipTests>
<testFailureIgnore>true</testFailureIgnore>
</configuration>
</plugin>
|
Now our project is all ready. Here I have used two custom defined properties viz., “suiteXmlFile” and “skipTests”. This is how their definition looks like.
<properties>
<suiteXmlFile>
<strong>src/test/resources/test1.xml</strong>
</suiteXmlFile>
<skipTests>false</skipTests>
</properties>
Well I am doing this, so that when I am running tests from the command line, I can have the luxury of changing my suite file or telling maven to ignore my tests.
Something like this:
1
|
mvn test -DskipTests= true |
(This would tell maven not to run my unit tests at all)
1
|
mvn test -DsuiteXmlFile=src /test/resources/test2 .xml |
(This would tell maven to run tests from test2.xml and not from test1.xml as defined in the pom file)
Make sure that you check-in your project into some version control system such as git/svn because hudson/jenkins pulls source code from version control systems and not from file systems.
Once you have your hudson instance setup, and are in the configure job page of your jenkins/fusion instance, look for a “build” section.
There in the Goals and options section, all you would do is specify the goals
for e.g.,
1
|
test -DsuiteXmlFile=src /test/resources/test2 .xml |
(if you want this job to run unit tests from test2.xml) or just
1
|
test |
(if you want to by default run the tests from test1.xml). Here’s how my complete pom file looks like :
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>organized.chaos</groupId>
<artifactId>insanity</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>insanity</name>
<properties>
<suiteXmlFile>src/test/resources/test1.xml</suiteXmlFile>
<skipTests>false</skipTests>
</properties>
<dependencies>
<!-- Adding TestNG for unit test support -->
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.4</version>
</dependency>
<!-- Adding Selenium dependency -->
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-server</artifactId>
<version>2.21.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- using the compiler plug-in to specify that this project is to be compiled with JDK 1.6 -->
<!-- This is needed so that we get the JDK annotation support that was introduced recently -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.6</version>
<configuration>
<!-- You can specify a specific testng.xml file here <suiteXmlFiles>
<suiteXmlFile>src/test/resources/testng-sample.xml</suiteXmlFile> </suiteXmlFiles> -->
<!-- Or dynamically with something like '-DsuiteXmlFile=src/test/resources/testng-sample.xml' -->
<suiteXmlFiles>
<suiteXmlFile>${suiteXmlFile}</suiteXmlFile>
</suiteXmlFiles>
<!-- Build with '-DskipTests=true' to bypass test execution @ build time Default: false -->
<skipTests>${skipTests}</skipTests>
<testFailureIgnore>true</testFailureIgnore>
</configuration>
</plugin>
</plugins>
</build>
</project>
Continuous Integration with Selenium的更多相关文章
- 持续集成(Continuous Integration)基本概念与实践
本文由Markdown语法编辑器编辑完成. From https://blog.csdn.net/inter_peng/article/details/53131831 1. 持续集成的概念 持续集成 ...
- TeamCity vs Jenkins: Which is the Better Continuous Integration (CI) Server for .NET Software Development?
原文:http://www.excella.com/insights/teamcity-vs-jenkins-better-continuous-integration-server So, you’ ...
- [转]GitLab Continuous Integration (GitLab CI/CD)
本文转自:https://docs.gitlab.com/ee/ci/README.html GitLab Continuous Integration (GitLab CI/CD) The bene ...
- 读《Top benefits of continuous integration》有感
看到一片文章<Top benefits of continuous integration>,这张图画的很棒.将整个CI流程各阶段,列举出来了. 作者在文章里面介绍了CI和TDD,以及采用 ...
- Continuous Integration for iOS Apps with Visual Studio Team Services
原文引用自:https://blog.xamarin.com/continuous-integration-for-ios-apps-with-visual-studio-team-services/ ...
- 关于CI/CD/CD (Continuous Integration/Continuous Delivery/Continuous Deployment)
Continuous Integration (CI) Continuous integration (CI) is the process that ensures the stability of ...
- 持续集成(CI – Continuous Integration)
持续集成(CI – Continuous Integration) 在传统的软件开发中,整合过程通常在每个人完成工作之后.在项目结束阶段进行.整合过程通常需要数周乃至数月的时间,可能会非常痛苦.持续集 ...
- Jenkins实现CI(Continuous Integration)到CD(Continuous Delivery)
Pipeline as Code是2.0的精髓所在,是帮助Jenkins实现CI(Continuous Integration)到CD(Continuous Delivery)华丽转身的关键推手.所谓 ...
- What is Continuous Integration?
什么叫持续集成? 原文: https://docs.microsoft.com/en-us/azure/devops/what-is-continuous-integration ---------- ...
随机推荐
- Windows cmd 生成目录结构 dir /b,tree /f,xcopy
>dir *.sh *.ksh *.java /s/b > list.txt >tree /f > list.txt >xcopy C:\folder\from_fold ...
- iOS-BMK标注&覆盖物
在iOS开发中,地图算是一个比较重要的模块.我们常用的地图有高德地图,百度地图,谷歌地图,对于中国而言,苹果公司已经不再使用谷歌地图,官方使用的是高德地图.下面将讲述一下百度地图开发过程中的一些小的知 ...
- visual studio NuGet 常用包管理命令
visual studio NuGet 常用包管理命令 查找包 Find-Package [包名] Find-Package [包名] -AllVersions 安装包 Install-Package ...
- APUE 学习笔记(五) 进程环境
1.main函数 C程序总是从main函数开始执行,当内核执行C程序时,在调用main函数之前先调用exec函数从内核获取命令行参数和环境变量值 2.进程终止 正常终止: (1)在main函数内执 ...
- 【Vijos1222】等值拉面(DP)
题意:有N个数对(a[i],b[i]) 每次可以把(x,y)变成(x+a[i],y+b[i])或(x+b[i],x+a[i]),后者称为交换一次 求使abs(x-y)最小时的最小交换次数 n<= ...
- 【CF173B】Chamber of Secrets(二分图,最短路)
题意:给你一个n*m的地图,现在有一束激光从左上角往右边射出,每遇到‘#’,你可以选择光线往四个方向射出,或者什么都不做,问最少需要多少个‘#’往四个方向射出才能使关系在n行往右边射出. 思路:将每一 ...
- J2ME开发基本语法及小实例专题
原文发布时间为:2008-07-31 -- 来源于本人的百度文章 [由搬家工具导入] http://www.wcplym.com/sbjtClassArtl.asp?id=4 ·Canva专题:漂亮的 ...
- 为了防止detailsview中修改后,而girdview却没立即更新显示
原文发布时间为:2008-07-30 -- 来源于本人的百度文章 [由搬家工具导入] 可以在detailsview的事件中添加如下语句,即增加一个头,让它在0秒的时候刷新: Response.AddH ...
- es6总结(十二)--generator
- vue.js源码学习分享(二)
/** * Check if value is primitive//检查该值是否是个原始值 */ function isPrimitive (value) { return typeof value ...