zoukankan      html  css  js  c++  java
  • 第三章 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 iuhAppDataLocalTemp estng-eclipse-44348565 estng-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:workspaceSelenideStudysrcmainjaval3 estng-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 iuhAppDataLocalTemp estng-eclipse--190367475 estng-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

     

  • 相关阅读:
    创业失败,是应该坚持还是给别人打工?
    在三四线小城市投资3至8万,做什么小生意好?
    在小县城做什么生意好?
    在农村创业有哪些优势和机会?
    听说做餐饮的都在赔钱,为什么新店却越开越多?
    现在做什么行业好一点?
    手头有五万左右,想做个小生意,有什么值得推荐的?
    可以给我个创业的建议吗?
    如果你现在月工资纯入7千左右,30多岁有家庭但前途迷茫,你会独自创业打拼吗?
    JeeSite 4.0 简化业务逻辑层开发
  • 原文地址:https://www.cnblogs.com/hylinux/p/7444497.html
Copyright © 2011-2022 走看看