第三章 Selenide测试框架(五)

1.5.1   TestNg是什么?

 

TestNg按照官方的定义:

TestNg是一个测试框架,其灵感来自JUnit和NUnit,但引入了一些新的功能,使其功能更强大,使用更方便。

TestNG是一个开源自动化测试框架;TestNG表示下一代(Next Generation的首字母)。 TestNG类似于JUnit(特别是JUnit 4),但它不是JUnit框架的扩展。它的灵感来源于JUnit。它的目的是优于JUnit,尤其是在用于测试集成多类时。就算不熟悉JUnit也不影响学习TestNg框架。

 

 那么为什么我们需要TestNg

  • 注释可以帮助我们来组织使测试更容易。
  • 灵活的测试配置。
  • 测试例可以更容易地进行分组
  • 可以使用TestNg实现测试并行
  • 支持数据驱动测试
  • 内置的报告

总结一下,我们需要通过TestNg来组织我们来运行的测试用例,配置测试调度策略,生产测试报告,某些情况下可能还需要实现数据驱动或者并行调度测试用例等等。所以通过学习TestNg常用的功能,可以使测试更灵活、简单。

 

其实我们在前面的代码示例中一直在使用testng注解执行测试。

public class testTestng {

 

      @Test  //testNg提供的注解

      public void testTestNg() {

            //指定Driver 的存放目录

            System.setProperty("webdriver.chrome.driver", "c:/driver/chromedriver.exe");

            //指定需要启动的浏览器类型

            System.setProperty("selenide.browser", "Chrome");

            //打开测试地址

            Selenide.open("https://www.baidu.com");

            //设置等待时间

            System.out.println("----------------------");

            Selenide.sleep(5000);

      }

}

 

1.5.2   TestNg注解

 

TestNG选择使用注解来注释测试类。

以下是TestNG支持的注释列表:

 

注解

描述

@BeforeSuite

在该套件的所有测试都运行在注释的方法之前,仅运行一次。

@AfterSuite

在该套件的所有测试都运行在注释方法之后,仅运行一次。

@BeforeClass

在调用当前类的第一个测试方法之前运行,注释方法仅运行一次。

@AfterClass

在调用当前类的第一个测试方法之后运行,注释方法仅运行一次

@BeforeTest

注释的方法将在属于<test>标签内的类的所有测试方法运行之前运行。

@AfterTest

注释的方法将在属于<test>标签内的类的所有测试方法运行之后运行。

@BeforeGroups

配置方法将在之前运行组列表。 此方法保证在调用属于这些组中的任何一个的第一个测试方法之前不久运行。

@AfterGroups

此配置方法将在之后运行组列表。该方法保证在调用属于任何这些组的最后一个测试方法之后不久运行。

@BeforeMethod

注释方法将在每个测试方法之前运行。

@AfterMethod

注释方法将在每个测试方法之后运行。

@DataProvider

标记一种方法来提供测试方法的数据。 注释方法必须返回一个Object [] [],其中每个Object []可以被分配给测试方法的参数列表。 要从该DataProvider接收数据的@Test方法需要使用与此注释名称相等的dataProvider名称。

@Factory

将一个方法标记为工厂,返回TestNG将被用作测试类的对象。 该方法必须返回Object []

@Listeners

定义测试类上的侦听器。

@Parameters

描述如何将参数传递给@Test方法。

@Test

将类或方法标记为测试的一部分。

 

 

1.5.3   注解实例

 

TestNg运行可以区分为单测试类运行和测试套件类运行

单测试类运行实例:

public class testTestng {

 

      @Test(priority = 10)

      public void testStep1() {

            System.out.println("测试方法--1--优先级低后执行");

      }

 

      @Test(priority = 2)

      public void testStep2() {

            System.out.println("测试方法--2--优先级高先执行");

      }

 

      @BeforeMethod

      public void testBeforeMethod() {

            System.out.println("测试方法执行前执行");

      }

 

      @AfterMethod

      public void testAfterMethod() {

            System.out.println("测试方法执行后执行");

      }

 

      @BeforeTest

      public void testBeforeTest() {

            System.out.println("在测试类的所有test注解方法执行前执行");

            //如果一个类中有多个test注解方法,只执行一次

      }

 

      @AfterTest

      public void testAfterTest() {

            System.out.println("在测试类的所有test注解方法执行后执行");

            //如果一个类中有多个test注解方法,只执行一次

      }

 

      @BeforeClass

      public void testBeforeClass() {

            System.out.println("在调用当前类的第一个测试方法之前运行,注释方法仅运行一次");

            //在同一个类的中作用与beforetest相同

      }

 

      @AfterClass

      public void testAfterClass() {

            System.out.println("在调用当前类的第一个测试方法之后运行,注释方法仅运行一次");

            //在同一个类的中作用与aftertest相同

      }

 

      @BeforeSuite

      public void testBeforSuite() {

            System.out.println("在集合内的所有测试类执行前执行");

            //在单测试类中作用等同于beforetest

      }

 

      @AfterSuite

      public void testAfterSuite() {

            System.out.println("在集合内的所有测试类执行后执行");

            //在单测试类中作用等同于aftertest

      }

 

}

 

测试结果如下:

[TestNG] Running:

  C:\Users\niuh\AppData\Local\Temp\testng-eclipse-44348565\testng-customsuite.xml

 

在集合内的所有测试类执行前执行

在测试类的所有test注解方法执行前执行

在调用当前类的第一个测试方法之前运行,注释方法仅运行一次

测试方法执行前执行

测试方法--2--优先级高先执行

测试方法执行后执行

测试方法执行前执行

测试方法--1--优先级低后执行

测试方法执行后执行

在调用当前类的第一个测试方法之后运行,注释方法仅运行一次

在测试类的所有test注解方法执行后执行

PASSED: testStep2

PASSED: testStep1

 

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

    Default test

    Tests run: 2, Failures: 0, Skips: 0

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

 

在集合内的所有测试类执行后执行

 

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

Default suite

Total tests run: 2, Failures: 0, Skips: 0

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

 

在工程的test-output目录下可以看到index.html的结果报告,如下:

      

 

 

 

测试套件运行

 通常在一个自动化测试工程中,我们会编写多个测试用例并且需要批量运行,那么就需要通过TestNg.xml来实现多个测试用例组合的测试套件。

  1. 创建多个测试用例类

 package l3;

 

import org.testng.annotations.Test;

 

public class testng1 {

      @Test

      public void testStep() {

            System.out.println("测试用例1");

      }

      }

package l3;

 

import org.testng.annotations.Test;

 

public class testng2 {

      @Test

      public void testStep() {

            System.out.println("测试用例2");

      }

      }

 

 

  1. 创建testng执行的XML文件

 <?xml version="1.0" encoding="UTF-8"?>

<suite name="TestAll">

      <test name="testAllcase">

            <classes>

                  <class name="l3.testng1" />

                  <class name="l3.testng2" />

            </classes>

      </test>

</suite>

  1. 右键xml文件按照testng suite执行

 [TestNG] Running:

  C:\workspace\SelenideStudy\src\main\java\l3\testng-Demo.xml

 

测试用例1

测试用例2

 

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

TestAll

Total tests run: 2, Failures: 0, Skips: 0

 

1.5.4   数据驱动

TestNG中的另一个有趣的功能是参数化测试。 在大多数情况下,您会遇到业务逻辑需要大量测试的场景。 参数化测试允许开发人员使用不同的值一次又一次地运行相同的测试。

TestNG可以通过两种不同的方式将参数直接传递给测试方法:

 

使用注解DataProvider是最常用的方式,下面写个简单的例子(通过数据参数驱动的方式依次传值到test方法中):

 

package l3;

 

import org.testng.annotations.DataProvider;

import org.testng.annotations.Test;

 

public class testdataprovider {

 

      @Test(dataProvider = "providerNumber")

      public void test(int number1, int number2) {

            System.out.println("numeber1:" + number1 + "+ number2:" + number2 + "=-->" + number1 + number2);

      }

 

      @DataProvider(name = "providerNumber")

      public Object[][] providerData() {

            return new Object[][] { { 10, 20 }, { 100, 100 }, { 11, 11 } };

      }

}

 

测试结果:

[TestNG] Running:

  C:\Users\niuh\AppData\Local\Temp\testng-eclipse--190367475\testng-customsuite.xml

 

numeber1:10+ number2:20=-->1020

numeber1:100+ number2:100=-->100100

numeber1:11+ number2:11=-->1111

PASSED: test(10, 20)

PASSED: test(100, 100)

PASSED: test(11, 11)

 

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

    Default test

    Tests run: 3, Failures: 0, Skips: 0

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

 

 

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

Default suite

Total tests run: 3, Failures: 0, Skips: 0

 

TestNg的dataProvider注解还有更多的使用方法,如果感兴趣的可以自己去菜鸟教程学习

1.5.5   测试结果

默认testng会在我们所在项目中生成test-output目录来保存测试结果:

一般我们需要查看emailable-report.html和index.html

emailable-report.html

 

 

index.html

 

 

posted @ 2017-08-28 16:40  hylinux  阅读(889)  评论(0编辑  收藏  举报