通过Testng+Jenkins实现Case参数化

在做自动化测试中,参数化非常常见。例如你希望你的自动化脚本能在不同的环境中执行。 当然参数化的方式非常多,例如可以把环境变量存放在文本中,excel文件中或者配置文件中等等,然后去写段代码去读取,往往需要编写一定的代码量,那有没有几乎没代码从而又可以实现参数化的方式呢?

这里简单介绍如何通过Testng + Jenkins 做参数化。

我们想通过Testng 做参数化除了可使用@DataProvider注解(详细例子参考:http://www.jianshu.com/p/895e4c118db9)这里不多说明,还可以用Testng提供的另一个注解@Parameters ,我们这里讲讲入如何通过这个注解测试方法传递任意个数的参数。

使用前稍作说明,DataProvider和Parameters使用场景的区别。DataProvider适合做比较复杂的参数化,测试值较多的情况,也就是我们常用来做数据驱动。而Parameters则适合参数值较为简单的场景,例如刚提到的代码需要在不同的测试环境执行,这个环境就是需要从代码抽取出来的参数。

@Parameters的用法,我们直接看个例子:
  首先我们新建个测试,代码如下:

    @Parameters({"env", "name", "pwd"})
    @Test
    public void parameterTest(String env, String userName, String pwd) {
        System.out.println("测试环境:" + env + "_登录名: " + userName + "_密码: " + pwd);
    }

上面测试方法parameterTest()中有3个参数(env,userName,pwd),而这三个参数值我们通过@Parameters注解来获取,需要注意的是这里的测试方法的参数跟@Parameters设置的获取参数的参数名可以不一致,但参数个数需要一致,否则会报错。这样我们已经写好了获取数据源,这时我们就得编写数据源。

我们都知道Testng的测试方法可以通过xml文件来运行,那么这时可以新建个xml文件,并在该xml文件设置数据源,xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Custom suite">

  <!-- name 必须Parameters注解接收名一致,value就是为参数的值-->
  <parameter name="env"  value="qa"/>
  <parameter name="name"  value="meyoung"/>
  <parameter name="pwd"  value="123456"/>

  <test verbose="1" name="Selenium_Demo" annotations="JDK">
    <classes>
      <!-- 设置需要执行的class路径名-->
      <class name="com.meyoung.demo.ParametersTest"/>
    </classes>
  </test>
</suite>

上面的xml中跟以往执行的xml相比,我们只是在上面加入parameter 标签,并设置对应的name和value值。需要注意的是name的值必须跟测试方法中@Parameters设置的接收参数的参数名一致,但参数个数可以xml中parameter标签的个数>=@Parameters接收的参数个数。value则是要传入的数据。

最后我们执行运行这个xml,看下执行结果:

Paste_Image.png

按期望值输出,准确无误。

@Parameters 注解除了跟@Test一起用外,还可以跟BeforeXXX和AfterXXX注解一起用,但是不能跟@DataProvider一起使用。

到这里我们其实已经讲完了通过Testng做参数化,但肯定有疑问呀,这跟代码里面写死的有啥区别,如果需要换个环境换个用户不还得去修改xml文件。

咦。。。

这时我们想起了构建脚本我们都用Jenkins,而且Jenkins构建时可以参数化构建,那我们是不是可以把这些参数的值通过Jenkins构件时传入呢? 答案肯定的。怎么做?

我们新建个Jenkins job,勾选参数化构建过程,并添加4个构建参数如下,除了测试方法用到的参数外,我们还添加了RunTest参数,来指定我们需要执行的xml文件:

Paste_Image.png

接着我们添加构建方式,推荐用maven工程,然后我们直接用maven命令执行,这里我直接指向本地的pom文件:

Paste_Image.png

再接着我们需要修改下我们的工程代码

1). 修改pom.xml文件加入执行和编译插件,并添加${RunTest}用于获取Jenkins的构建参数。

    <build>
        <plugins>
            <plugin>
                <!-- 编译插件-->
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.3</version>
                <inherited>true</inherited>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>

            <!-- Testng 执行插件-->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.17</version>
                <configuration>
                    <suiteXmlFiles>
                        <!-- 通过 ${RunTest} 来获取Jenkins的构建参数-->
                        <suiteXmlFile>${RunTest}</suiteXmlFile>
                    </suiteXmlFiles>
                </configuration>
            </plugin>
        </plugins>
    </build>

2).修改刚创建的Testng 执行xml,把原来的value的值改成获取Jenkins构建参数的方式,修改后的xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Custom suite">

  <!-- name 必须Parameters注解接收名一致,${XXX}获取Jenkins的构建参数名-->
  <parameter name="env"  value="${env}"/>
  <parameter name="name"  value="${UserName}"/>
  <parameter name="pwd"  value="${password}"/>


  <test verbose="1" name="Selenium_Demo" annotations="JDK">
    <classes>
      <!-- 设置需要执行的class路径名-->
      <class name="com.meyoung.demo.ParametersTest"/>
    </classes>
  </test>
</suite>

注意:通过${}获取Jenkins构建参数的值,{}中的值必须跟Jenkins设置的构建参数名一致

最后保存配置,我们试着构建下Job看看结果,例如我构建如下:

Paste_Image.png

那么从控制台输出可以看到输出数据达到预期,则构建成功:

Paste_Image.png

这样以后我们构件时就可以通过Jenkins上填写不同的参数,以达到构建参数化的效果。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容

  • 感谢原作者的奉献,原作者博客地址:http://blog.csdn.net/zhu_ai_xin_520/arti...
    狼孩阅读 13,995评论 1 35
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,593评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,418评论 25 707
  • TestNG系列:TestNG和Junit4的参数化测试对比TestNG运行指定测试套件TestNG整合Repor...
    测试你个头阅读 2,276评论 0 2
  • 爱伯的微博:发现一张未署名的杰作,真是太厉害了! 斯卡尔评论:我觉得…你的真实想法是,画家是个混球。 爱伯回复:@...
    后海的卡卡西阅读 275评论 0 0