天天看点

自动化测试框架selenium+java+TestNG 自动化测试框架selenium+java+TestNG——TestNG详解

学习教程

https://www.yiibai.com/testng/hello-world-example.html

TestNG按顺序执行case

https://www.cnblogs.com/dreamyu/p/6407814.html

一、TestNG的优点

  1.1 漂亮的HTML格式测试报告

  1.2 支持并发测试

  1.3 参数化测试更简单

  1.4 支持输出日志

  1.5 支持更多功能的注解

二、编写TestNG测试用例的步骤

  2.1 使用 Eclipse生成TestNG的测试程序框架

  2.2 在生成的程序框架中编写测试代码逻辑

  2.3 根据测试代码逻辑,插入TestNG注解标签

  2.4 配置Testng.xml文件,设定测试类、测试方法、测试分组的执行信息

  2.5 执行TestNG的测试程序

三、如何安装TestNG?

      启动Eclipse,选择Help-》Install New Software-》点击add-》name中输入TestNG,location中输入“http://beust.com/eclipse/”,点击ok-》在弹出的install对话框中勾选TestNG复选框-》Next-》Accept-》Finish

四、testNG用例执行后如何查看执行结果?

  4.1 在Console标签栏中展示测试用例的执行结果,如图:

  

自动化测试框架selenium+java+TestNG 自动化测试框架selenium+java+TestNG——TestNG详解

  4.2 在工程下也会生成一个test-output文件夹,如图:

  

自动化测试框架selenium+java+TestNG 自动化测试框架selenium+java+TestNG——TestNG详解

 

五、TestNG常用注解:执行顺序如下

  @BeforeSuite > @BeforeTest > @BeforeMethod > @Test > @AfterMethod > @AfterTest > @AfterSuite

@BeforeSuite 表示会在当前测试集合中的任意一个测试用例开始运行前执行
@AfterSuite 表示会在当前测试集合中的所有测试程序运行结束之后执行
@BeforeTest 表示会在Test中的任意一个测试用例开始运行前执行
@AfterTest 表示会在Test中的所有测试用例运行结束后执行
@BeforeGroups 分组测试用例的任一测试用例开始运行前执行
@AfterGroups 分组测试用例的所有测试用例运行结束后执行
@BeforeClass 在当前测试类的任意一个测试用例开始运行前执行
@AfterClass 在当前测试类的所有测试用例运行结束后执行
@BeforeMethod 在每个测试方法开始运行前执行
@AfterMethod 在每个测试方法运行结束后执行
@Test 被认为是一个测试方法,既一个测试用例

六、如何创建TestNG测试集合?

  6.1 测试集合:在自动化测试的执行过程中,通常会产生批量运行多个测试用例的需求,此需求称为运行测试集合(Test Suite)

  6.2 TestNG的测试用例可以是相互独立的,也可以按照特定的顺序来执行(配置TestNG.xml)

  6.3 如何配置testNG.xml文件?     

<suite name = "TestNG Suite">    //自定义的测试集合名称
  <test name = "test1">    //自定义的测试名称
    <classes>    //定义被运行的测试类
      <class name = "cn.gloryroad.FirstTestNGDemo" />    //测试类的路径
      <class name = "cn.gloryroad.NewTest" />
    </classes>
  </test> 
</suite>      

七、测试用例的分组(group)

  7.1 只执行一组分组配置如下:

<suite name = "TestNG Suite">
  <test name = "Grouping">
    <groups>
      <run>
        <include name = "动物" />
      </run>
    </groups>
    <classes>
      <class name = "cn.gloryroad.Grouping"/>
    </classes>
  </test>
</suite>      

  7.2 执行多组分组时配置如下(两种形式都可以):

<suite name = "TestNG Suite">
  <test name = "Grouping">
    <groups>
      <run>
        <include name = "动物" />   //name分组名称
             <include name = "人" />
      </run>
    </groups>
    <classes>
      <class name = "cn.gloryroad.Grouping"/>
    </classes>
  </test>
</suite>                  
<suite name = "TestNG Suite">
    <test name = "Grouping">
        <groups>
       <define name = "All">
          <include name = "动物" />
          <include name = "人" />
       </define>
       <run>
          <include name = "All" />
       </run>
     </groups>      
    <classes>
      <class name = "cn.gloryroad.Grouping"/>
    </classes>
  </test> 
</suite>      

八、依赖测试(dependsOnMethod)

  @Test(dependsOnMethod = {"方法名称"})

  被依赖的方法优先于此方法执行

九、特定顺序执行测试用例(priority)

  @Test(priority = 0/1/2/3/4/…)

  按照数字大小顺序优先执行,优先执行1,然后是2…

十、如何跳过某个测试方法(enabled = false)

  @Test(priority = 0/1… , enabled = false)

  执行结束后,在测试报告中显示跳过的测试用例数,例如skip=1

十一、数据注解

  11.1 参数化测试(@Parameters-》通过xml文件从外部给测试方法传参):<Parameter name="Type" value="chrome"/>  -》参考http://www.yiibai.com/html/testng/2013/0916303.html 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

创建测试案例类

创建一个Java测试类 ParameterizedTest1.java.

测试方法parameterTest()添加到测试类。此方法需要一个字符串作为输入参数。

添加注释 

@Parameters

(

"myName"

) 到此方法。该参数将被传递testng.xml,在下一步我们将看到一个值。

创建Java类文件名 ParameterizedTest1.java 在 C:\ > TestNG_WORKSPACE

  

import

org.testng.annotations.Parameters;

  

import

org.testng.annotations.Test;

  

public

class

ParameterizedTest1 {

  

@Test

  

@Parameters

(

"myName"

)

  

public

void

parameterTest(String myName) {

  System.out.println(

"Parameterized value is : "

+ myName);

  }

  }

创建 TESTNG.XML

创建 testng.xml C:\ > TestNG_WORKSPACE 执行测试案例

  <?xml version=

"1.0"

encoding=

"UTF-8"

?><!DOCTYPE suite SYSTEM 

"http://testng.org/testng-1.0.dtd"

>

  <suite name=

"Suite1"

>

  <test name=

"test1"

>

  <parameter name=

"myName"

value=

"manisha"

/>

  <classes>

     <

class

name=

"ParameterizedTest1"

/>

      </classes>

    </test>

  </suite>

我们还可以定义参数在<suite>级别。假设我们已经定义在两个<suite>和<test>级别myName,在这种情况下,常规的作用域规则适用。这意味着,任何类里面<test>标签将查看值参数定义在<test>,而testng.xml文件中的类的其余部分将看到定义在<suite>中值

编译使用javac的测试用例类。

C:\TestNG_WORKSPACE>javac ParameterizedTest1.java

现在,运行testng.xml,其中将运行parameterTest方法。TestNG的将试图找到一个命名myName的第一<test>标签的参数,然后,如果它不能找到它,它会搜索包围在的<suit>标签。

C:\TestNG_WORKSPACE>java -cp 

"C:\TestNG_WORKSPACE"

org.testng.TestNG testng.xml

验证输出。

Parameterized value is : manisha

===============================================

Suite1

Total tests run: 

1

, Failures: 

, Skips: 

===============================================

TestNG 对testng.xml 的参数的类型指定的值会自动尝试转换。下面是支持的类型:

String

int

/Integer

boolean

/Boolean

byte

/Byte

char

/Character

double

/Double

float

/Float

long

/Long

short

/Short

  11.2 数据驱动(@DataProvider)-》参考http://www.yiibai.com/html/testng/2013/0916303.html 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

当你需要通过复杂的参数或参数需要创建从Java(复杂的对象,对象读取属性文件或数据库等..),在这种情况下,可以将参数传递使用数据提供者。数据提供者

@DataProvider

的批注的方法。这个注解只有一个字符串属性:它的名字。如果不提供名称,数据提供者的名称会自动默认方法的名称。数据提供者返回一个对象数组。

让我们看看下面的例子使用数据提供者。第一个例子是

@DataProvider

的使用Vector,String或Integer 作为参数,第二个例子是关于

@DataProvider

的使用对象作为参数。

实例 

1

在这里 

@DataProvider

通过整数和布尔参数。

创建Java类

创建一个java类PrimeNumberChecker.java。这个类检查,如果是素数。创建这个类在 C:\ > TestNG_WORKSPACE

  

public

class

PrimeNumberChecker {

   

public

Boolean validate(

final

Integer primeNumber) {

    

for

(

int

i = 

2

; i < (primeNumber / 

2

); i++) {

      

if

(primeNumber % i == 

) {

        

return

false

;

  }

  }

  

return

true

;

  }

  }

创建测试案例类

创建一个Java测试类 ParamTestWithDataProvider1.java.

定义方法primeNumbers(),其定义为DataProvider 使用注释。此方法返回的对象数组的数组。

测试方法testPrimeNumberChecker()添加到测试类中。此方法需要一个整数和布尔值作为输入参数。这个方法验证,如果传递的参数是一个素数。

添加注释 

@Test

(dataProvider = 

"test1"

) 到此方法。dataProvider的属性被映射到

"test1"

.

创建Java类文件名ParamTestWithDataProvider1.java 在 C:\ > TestNG_WORKSPACE

  

import

org.testng.Assert;

  

import

org.testng.annotations.BeforeMethod;

  

import

org.testng.annotations.DataProvider;

  

import

org.testng.annotations.Test;

  

public

class

ParamTestWithDataProvider1 {

    

private

PrimeNumberChecker primeNumberChecker;

  

   

@BeforeMethod

   

public

void

initialize() {

   primeNumberChecker = 

new

PrimeNumberChecker();

   }

  

@DataProvider

(name = 

"test1"

)

   

public

static

Object[][] primeNumbers() {

  

return

new

Object[][] { { 

2

true

}, { 

6

false

}, { 

19

true

},

        { 

22

false

}, { 

23

true

} };

  }

   

// This test will run 4 times since we have 5 parameters defined

  

@Test

(dataProvider = 

"test1"

)

   

public

void

testPrimeNumberChecker(Integer inputNumber,

  Boolean expectedResult) {

  System.out.println(inputNumber + 

" "

+ expectedResult);

  Assert.assertEquals(expectedResult,

  primeNumberChecker.validate(inputNumber));

  }

  }

创建 TESTNG.XML

创建 testng.xml C:\ > TestNG_WORKSPACE 执行测试案例。

  <?xml version=

"1.0"

encoding=

"UTF-8"

?><!DOCTYPE suite SYSTEM 

"http://testng.org/testng-1.0.dtd"

>

  <suite name=

"Suite1"

>

   <test name=

"test1"

>

  <classes>

      <

class

name=

"ParamTestWithDataProvider1"

/>

      </classes>

   </test>

  </suite>

编译使用javac的测试用例类。

C:\TestNG_WORKSPACE>.javac ParamTestWithDataProvider1.java PrimeNumberChecker.java

运行testng.xml.

C:\TestNG_WORKSPACE>java -cp 

"C:\TestNG_WORKSPACE"

org.testng.TestNG testng.xml

验证输出。

2

true

6

false

19

true

22

false

23

true

===============================================

Suite1

Total tests run: 

5

, Failures: 

, Skips: 

===============================================

实例 

2

在这里,

@DataProvider

传递对象作为参数。

创建Java类

创建一个Java类 Bean.java, 对象带有 get/set 方法, 在 C:\ > TestNG_WORKSPACE.

public

class

Bean {

private

String val;

private

int

i;

public

Bean(String val, 

int

i){

this

.val=val;

this

.i=i;

}

public

String getVal() {

return

val;

}

public

void

setVal(String val) {

this

.val = val;

}

public

int

getI() {

return

i;

}

public

void

setI(

int

i) {

this

.i = i;

}

}

创建测试案例类

创建一个Java测试类 ParamTestWithDataProvider2.java.

定义方法primeNumbers(),其定义为DataProvider使用注释。此方法返回的对象数组的数组。

添加测试类中测试方法TestMethod()。此方法需要对象的bean作为参数。

添加注释 

@Test

(dataProvider = 

"test1"

) 到此方法.  dataProvider 属性被映射到 

"test1"

.

创建Java类文件名 ParamTestWithDataProvider2.java 在 C:\ > TestNG_WORKSPACE

  

import

org.testng.annotations.DataProvider;

  

import

org.testng.annotations.Test;

  

public

class

ParamTestWithDataProvider2 {

   

@DataProvider

(name = 

"test1"

)

     

public

static

Object[][] primeNumbers() {

     

return

new

Object[][] { { 

new

Bean(

"hi I am the bean"

111

) } };

   }

   

@Test

(dataProvider = 

"test1"

)

   

public

void

testMethod(Bean myBean) {

    System.out.println(myBean.getVal() + 

" "

+ myBean.getI());

   }

  }

创建 TESTNG.XML

创建一个文件 testng.xml C:\ > TestNG_WORKSPACE 来执行测试用例.

  <?xml version=

"1.0"

encoding=

"UTF-8"

?><!DOCTYPE suite SYSTEM 

"http://testng.org/testng-1.0.dtd"

>

  <suite name=

"Suite1"

>

  <test name=

"test1"

>

  <classes>

     <

class

name=

"ParamTestWithDataProvider2"

/>

   </classes>

   </test>

  </suite>

编译使用javac的测试用例类。

C:\TestNG_WORKSPACE>javac ParamTestWithDataProvider2.java Bean.java

运行 testng.xml.

C:\TestNG_WORKSPACE>java -cp 

"C:\TestNG_WORKSPACE"

org.testng.TestNG testng.xml

验证输出。

hi I am the bean 

111

===============================================

Suite1

Total tests run: 

1

, Failures: 

, Skips: 

===============================================

  

十二、测试报告中自定义日志(Reporter.log(“输入自定义内容”)),例如:

  @Test(groups = {"人"})

  public void student(){

    System.out.println("学生方法被调用");

    Reporter.log("学生方法自定义日志");

  }

自动化测试框架selenium+java+TestNG 自动化测试框架selenium+java+TestNG——TestNG详解