testng.xml
testng.xml是为了更方便的管理和执行测试用例,同时也可以结合其他工具
You can invoke TestNG in several different ways: 你可以用以下三种方式执行测试
- With a testng.xml file 直接run as test suite
- With ant 使用ant
- From the command line 从命令行
- eclipse 直接在eclipse执行
textng.xml 基本格式如下:
<test name="Regression1"> <groups> <run> <exclude name="brokenTests" /> <include name="checkinTests" /> </run> </groups> <classes> <class name="test.IndividualMethodsTest"> <methods> <include name="testMethod" /> </methods> </class> </classes> </test>
suite:定义一个测试套件,可包含多个测试用例或测试group
suite 里可以设置是否使用多线程:
parallel="methods": TestNG will run all your test methods in separate threads. Dependent methods will also run in separate threads but they will respect the order that you specified.
parallel="tests": TestNG will run all the methods in the same <test> tag in the same thread, but each <test> tag will be in a separate thread. This allows you to group all your classes that are not thread safe in the same <test> and guarantee they will all run in the same thread while taking advantage of TestNG using as many threads as possible to run your tests.
parallel="classes": TestNG will run all the methods in the same class in the same thread, but each class will be run in a separate thread.
parallel="instances": TestNG will run all the methods in the same instance in the same thread, but two methods on two different instances will be running in different threads.
- parallel="classes" 每个测试用例class级别多线程
- thread-count="3" 线程数为3,可同时执行3个case
- preserve-order="true" 根据官方解释(If you want the classes and methods listed in this file to be run in an unpredictible order, set the preserve-order attribute to false)设置为false乱序执行,设置为true会按照你配置执行
- Parameter标签传递参数
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite name="Suite" parallel="classes" thread-count="3"> <test verbose="2" preserve-order="true" name="TestDebug"> <parameter name="driverName" value="chrome" /> <classes> <class name="com.dbyl.tests.Case1" /> <class name="com.dbyl.tests.JDaddress" /> <class name="com.dbyl.tests.UseCookieLogin" /> <class name="com.dbyl.tests.MapTest" /> <class name="com.dbyl.tests.loginTest" /> </classes> </test> <!-- Test --> </suite> <!-- Suite -->
参数怎么使用?
这要在case里添加@Parameters 的annotations
如果有多个parameter,可以一次传入
package com.dbyl.tests; import org.testng.annotations.Parameters; import org.testng.annotations.Test; /** * This Test for verify Parameter annotation * @author Young * */ public class passParameter { /** * * @param parameter1 * @param parameter2 */ @Parameters({"parameter1","parameter2"}) @Test(groups="parameter") public void parameter(String parameter1,int parameter2 ) { System.out.println("parameter1 is "+parameter1 ); System.out.println("parameter2 is "+parameter2 ); } }
其中testng的配置文件为:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite name="Suite" parallel="classes" thread-count="5"> <test verbose="2" preserve-order="true" name="TestDebug"> <parameter name="parameter1" value="parameter1" /> <parameter name="parameter2" value="123" /> <classes> <class name="com.dbyl.tests.passParameter" /> <class name="com.dbyl.tests.TestngExample" /> </classes> </test> <!-- Test --> </suite> <!-- Suite -->
这里使用两个parameter标签,传递两个参数
执行结果如下:
[TestNG] Running:
C:UsersworkspaceDemoParametertestng.xml
[TestRunner] Starting executor for test TestDebug with time out:2147483647 milliseconds.
parameter1 is parameter1
parameter2 is 123
接下来尝试从ant命令行执行test suite
首先在 build配置文件加入:
<taskdef resource="testngtasks" classpath="testng.jar"/>
在target执行文件设置testng.xml路径
<xmlfileset dir="${basedir}" includes="Parametertestng.xml"/>
<?xml version="1.0"?> <project name="Demo" default="run" basedir="."> <echo message="Start selenium Grid" /> <echo message="import libs" /> <path id="run.classpath"> <fileset dir="${basedir}"> <include name="lib/poi/*.jar" /> <include name="lib/poi/lib/*.jar" /> <include name="lib/testng.jar" /> <include name="lib/sikuli-script.jar" /> <include name="lib/*.jar" /> </fileset> <fileset dir="${basedir}/lib/selenium"> <include name="selenium-java-2.45.0.jar" /> <include name="libs/*.jar" /> </fileset> </path> <taskdef name="testng" classname="org.testng.TestNGAntTask" classpathref="run.classpath" /> <target name="clean"> <delete dir="build"/> </target> <target name="compile" depends="clean"> <echo message="mkdir"/> <mkdir dir="build/classes"/> <javac srcdir="src" destdir="build/classes" debug="on" encoding="UTF-8"> <classpath refid="run.classpath"/> </javac> </target> <path id="runpath"> <path refid="run.classpath"/> <pathelement location="build/classes"/> </path> <target name="run" depends="compile"> <testng classpathref="runpath" outputDir="test-output" haltonfailure="true" useDefaultListeners="false" listeners="org.uncommons.reportng.HTMLReporter,org.testng.reporters.FailedReporter" > <xmlfileset dir="${basedir}" includes="testng.xml"/> <jvmarg value="-Dfile.encoding=UTF-8" /> <sysproperty key="org.uncommons.reportng.title" value="AutoMation TestReport" /> </testng> </target> <target name="runTestng" depends="compile"> <testng classpathref="runpath" outputDir="test-output" haltonfailure="true" useDefaultListeners="false" listeners="org.uncommons.reportng.HTMLReporter,org.testng.reporters.FailedReporter" > <xmlfileset dir="${basedir}" includes="Parametertestng.xml"/> <jvmarg value="-Dfile.encoding=UTF-8" /> <sysproperty key="org.uncommons.reportng.title" value="AutoMation TestReport" /> </testng> </target> </project>
接下在在命令行执行: ant runTestng
运行结果:
C:UsersworkspaceDemo>ant runTestng
Buildfile: C:UsersworkspaceDemouild.xml
[echo] Start selenium Grid
[echo] import libs
clean:
[delete] Deleting directory C:UsersYoungworkspaceDemouild
compile:
[echo] mkdir
[mkdir] Created dir: C:UsersYoungworkspaceDemouildclasses
[javac] C:UsersYoungworkspaceDemouild.xml:25: warning: 'includeantrunt
ime' was not set, defaulting to build.sysclasspath=last; set to false for repeat
able builds
[javac] Compiling 21 source files to C:UsersYoungworkspaceDemouildcla
sses
runTestng:
[testng] [TestNG] Running:
[testng] C:UsersworkspaceDemoParametertestng.xml
[testng]
[testng] [TestRunner] Starting executor for test TestDebug with time out:2147
483647 milliseconds.
[testng] parameter1 is parameter1
[testng] parameter2 is 123
[testng] This is beforeClass method .The Value of a is: 1
[testng] This is beforeMethod method. The Value of a is: 2
[testng] This is Test method1 .The Value of a is: 3
[testng] This is AfterMethod Method .The Value of a is: 6
[testng] This is beforeMethod method. The Value of a is: 2
[testng] This is Test method2 .The Value of a is: 4
[testng] This is AfterMethod Method .The Value of a is: 6
[testng] This is AfterClass Method .The Value of a is: 5
[testng]
[testng] ===============================================
[testng] Suite
[testng] Total tests run: 3, Failures: 0, Skips: 0
[testng] ===============================================
[testng]
[testng] [TestNG] Time taken by [FailedReporter passed=3 failed=0 skipped=0]:
0 ms
[testng] [TestNG] Time taken by org.uncommons.reportng.HTMLReporter@65fe58e0:
120 ms
BUILD SUCCESSFUL
Total time: 5 seconds