所有testng套件的Beanshell脚本

时间:2018-01-11 11:21:01

标签: xml testng beanshell

我有30多个xml测试套件,适用于各种配置。 最近我介绍了beanshell脚本来处理动态组管理。 这要求我修改每个xml以包含如下代码:

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > <suite name="testSuite" parallel="none" >
    <test name="website general suite">
        <method-selectors>
            <method-selector>
                <script language="beanshell">
                    <![CDATA[whatGroup = System.getProperty("groupToRun","");
                        if(whatGroup.isEmpty()){
                          return true;
                        }
                        else{
                          return groups.containsKey(whatGroup) ;
                        }
                ]]>
                </script>
            </method-selector>
        </method-selectors>
        <classes>
            <class name="com.autoqa.website.tests.ExperiencePagesTests"/>
            <class name="com.autoqa.website.tests.FooterTests"/>
            <class name="com.autoqa.website.tests.HeroSliderTests"/>
            <class name="com.autoqa.website.tests.PosterTests"/>
            <class name="com.autoqa.website.tests.SimpleSmokeTests"/>
            <class name="com.autoqa.website.tests.WhatsOnTests"/>
            <class name="com.autoqa.website.tests.UTagJSTests"/>
            <class name="com.autoqa.website.tests.UTagsProxyTests"/>
        </classes>
    </test> </suite>

当它工作时,我想知道是否有办法将这个脚本放在一个地方并以简单的方式将它注入每个xml。所以,比方说,如果将来我想修改这个脚本,我只会做一次而不是30+ xmls。

1 个答案:

答案 0 :(得分:0)

完成此任务的一种方法是执行以下操作:

  1. 确保您使用的是最新发布的TestNG版本,6.13.1
  2. 构建实现org.testng.IAlterSuiteListener
  3. 的TestNG侦听器
  4. 通过套件xml文件中的<listeners>标记连接此侦听器。
  5. 如果您愿意,可以通过添加条件来丰富此侦听器,以便根据某些特定条件添加beanshell脚本。
  6. 以下是一个完整的示例,显示了所有这些内容。

    示例测试类

    package com.rationaleemotions.stackoverflow.qn48205890;
    
    import org.testng.annotations.Test;
    
    public class SampleTestClass {
        @Test
        public void a() {}
    
        @Test
        public void b() {}
    
        @Test
        public void c() {}
    }
    

    实现org.testng.IAlterSuiteListener

    的TestNG侦听器
    package com.rationaleemotions.stackoverflow.qn48205890;
    
    import org.testng.IAlterSuiteListener;
    import org.testng.xml.XmlMethodSelector;
    import org.testng.xml.XmlScript;
    import org.testng.xml.XmlSuite;
    import org.testng.xml.XmlTest;
    
    import java.util.Collections;
    import java.util.List;
    
    public class BeanShellScriptInjector implements IAlterSuiteListener {
        @Override
        public void alter(List<XmlSuite> suites) {
            XmlSuite suite = suites.get(0);
            XmlMethodSelector xms = new XmlMethodSelector();
            XmlScript script = new XmlScript();
            script.setLanguage("beanshell");
            script.setScript("System.out.println(\"Running \" + method.getName() + \"()\") ; return true;");
            xms.setScript(script);
            List<XmlMethodSelector> list = Collections.singletonList(xms);
            XmlTest xmlTest = suite.getTests().get(0);
            xmlTest.setMethodSelectors(list);
        }
    }
    

    TestNG套件xml文件

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
    <suite name="45160355_Suite" parallel="false" verbose="2">
        <listeners>
            <listener class-name="com.rationaleemotions.stackoverflow.qn48205890.BeanShellScriptInjector"/>
        </listeners>
        <test name="45160355_test" verbose="2">
            <classes>
                <class name="com.rationaleemotions.stackoverflow.qn48205890.SampleTestClass"/>
            </classes>
        </test>
    </suite>
    

    控制台输出

    ...
    ... TestNG 6.13.1 by Cédric Beust (cedric@beust.com)
    ...
    
    Running a()
    Running b()
    Running c()
    Running a()
    Running b()
    Running c()
    Running a()
    Running b()
    Running c()PASSED: a
    PASSED: b
    PASSED: c
    
    ===============================================
        45160355_test
        Tests run: 3, Failures: 0, Skips: 0
    ===============================================
    
    ===============================================
    45160355_Suite
    Total tests run: 3, Failures: 0, Skips: 0
    ===============================================
    
    
    Process finished with exit code 0