草庐IT

IDEA,Java + Maven + TestNG编写接口自动化测试用例脚本

涅槃Ls 2023-10-20 原文

写作背景:有点Java基础的功能测试人员(点点点工程师),所在项目有"去QE"的趋势,所以自己要多点亮其他技能,让路子走宽点。
简单说一下去QE:项目测试不再有专职的测试工程师来做,而是由开发工程师自己来进行。遵循“谁开发、谁测试、谁上线、谁On call”的原则。


一、Java、TestNG、JSONAssert都是什么

1.1、Java基础教程

我先复习Java的基本简介、语法、写法、使用。参考资料

  • 安装java 开发工具包:JDK8 或更高版本
  • 配置环境变量
  • 安装java开发工具:IDEA
  • Java基本语法:对象、类、实例、方法、实例变量、标识符【类名| 变量名| 方法名】、修饰符【用于修饰类中方法和属性】、变量【局部变量| 类变量/静态变量| 成员变量/非静态变量】、数组、枚举、关键字、注释、空行、继承、接口。
  • Java命名规范:大小写敏感、类名首字母大写的驼峰式、方法名首字母小写的驼峰式、源文件名必须和类名相同
  • Java基本概念:多态、集成、封装、抽象、类、对象、实例、方法、重载等等
  • Java基本类型(八种):byte、short、int、long、float、double、boolean、char
  • Java的运算符、循环结构、条件语句、switch case、Number & Math 类、Character 类、String 类、StringBuffer 和 StringBuilder 类、数组、日期时间、正则表达式、方法、流(Stream)、文件(File)和IO、Scanner 类、异常处理等等
  • Java的数据结构、集合框架、ArrayList、LinkedList、HashSet、HashMap、Iterator(迭代器)、Object 类、泛型、序列化等等
  • Java的网络编程、发送邮件 、多线程编程 、Applet 基础、文档注释、实例等等

1.2、TestNG

  • TestNG基本解释:(即Testing,Next Generation,即下一代测试技术)是Java中的一个开源自动化测试框架。它的灵感来源于JUnit。它的目的是优于JUnit,尤其是在用于测试集成多类时。它借鉴了Java的注解。它旨在涵盖所有类别的测试:单元,功能,端到端,集成等…
    详细使用说明请参考:TestNG官方链接
  • TestNG基本特点:【注解】、【使用Java面向对象的功能】、【支持综合类测试】、【独立的编译时代码自检审核和运行时配置/数据信息】、【支持编译测试不同优先级、不同类别的用例】、【灵活的插件API】、【支持多线程测试】等
  • 使用注解的好处:
    a、TestNG通过查找注释/注解来识别它感兴趣的方法。 因此,方法名称不限于任何模式或格式
    b、可以将其他参数传递给注释。
    c、注释是强类型的,所以编译器会马上标记任何错误。
    d、测试类不再需要扩展任何东西(如TestCase,对于JUnit3)。

1.3、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.4、JSONAssert

  • 将字符串转换为JSON对象,并将逻辑结构和数据与实际JSON进行比较。一个专注于理解 JSON 数据并使用该数据编写复杂 JUnit 测试的库。
  • 当strict(严格模式)设置为false(推荐设置)时,它会允许数据重排序以及结果可扩展(只要对比的JSON包含了所有预期JSON的所有字段),从而使测试不那么脆弱。建议关掉严格模式,除非你要求比较的JSON与预期的JSON中数组顺序相同,或者要求两者具有相同的字段。
    /**
     * Asserts that the JSONObject provided matches the expected string.  If it isn't it throws an
     * {@link AssertionError}.
     *
     * @param expectedStr Expected JSON string
     * @param actual JSONObject to compare
     * @param strict Enables strict checking
     * @throws JSONException JSON parsing error
     */
    public static void assertEquals(String expectedStr, JSONObject actual, boolean strict)
            throws JSONException {
        assertEquals(expectedStr, actual, strict ? JSONCompareMode.STRICT : JSONCompareMode.LENIENT);
    }


二、搭建框架(创建maven项目,配置testng依赖)

2.1、创建普通maven项目即可
2.2、在pom.xml中配置依赖
    <dependencies>
        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>${testng.version}</version>
        </dependency>
    </dependencies>
2.3、下载依赖(pom文件重新加载项目)


三、创建Demo测试类和方法

直接复制官网中的simple:


package com.demo.apitest.testcase;

import org.testng.annotations.*;

public class DemoTest {

    @BeforeClass
    public void setUp() {
        // code that will be invoked when this test is instantiated
    }

    @Test(groups = {"fast"})
    public void aFastTest() {
        System.out.println("Fast test");
    }

    @Test(groups = {"slow"})
    public void aSlowTest() {
        System.out.println("Slow test");
    }
}


四、两种方式运行(直接运行、xml方式运行)

4.1、直接运行

直接运行

4.2、xml方式运行

IDEA创建的项目默认不会生成testng.xml(用于控制测试执行的执行)文件,就需要在根目录手动创建该文件,同时需要在pom.xml文件中关联设置testng.xml。testng.xml写法参考官网:
官网中testng.xml

基本格式如下:

  • 每一个xml文件只能有一个suite,代表的是一个测试集;
  • 一个suite中可包含多个test,默认情况下,多个test会顺序执行。若希望多个test以不可预知的顺序运行,可将preserve-order 属性设置为false;
  • 每一个test里边可以写需要运行的测试用例的class。如果不写,默认会跑所有的测试用例;
  • 每个class可以指定要执行哪些用例,不执行哪些用例。如果不写method,则默认本类里的全部用例都执行。
新建testng.xml
pom文件中关联testng.xml

xml方式运行


五、实际应用中的常见用例写法

常见项目结构

├── src
│    ├── main
│    │    ├── java
│    │    │     └── com.demo.apitest           # 框架公共服务模块
│    │    │             └── annotations              # 注释
│    │    │             └── api                      # 后端接口定义
│    │    │             └── enums                    # 枚举
│    │    │             └── model                    # Model
│    │    │             └── service                  # 公共方法
│    │    │             └── utils                    # 公共工具方法
│    │    └── resources                              
│    │          ├── driver                           # selenium的chrome驱动,用于本地登陆获取cookie
│    │          └── application.yml                  # 配置文件
│    └── test
│         ├── java
│         │     ├── com.demo.apitest           # 框架公共服务模块
│         │     │      └── testcase                  # 接口测试脚本
│         │     └── MyBaseTestNg.java                # testng基础测试类,所有测试脚本的父类
│         └── resources                              
│               └── testdata                         # 接口测试数据
└── testng.xml                                 # testng测试套件配置

延伸下,在src.main.resources 目录下可创建一个 application .yml文件,用于配置公共参数,普通类型参数可使用 @value注解获取,list类型参数可使用@ConfigurationProperties注解获取


六、扩展:TestNG的常见测试场景

  • 预期异常测试
  • 忽略测试
  • 超时测试
  • 分组测试
  • 套件测试(一起运行多个测试类)
  • 依赖测试
  • 参数化测试
  • 参数测试实例

有关IDEA,Java + Maven + TestNG编写接口自动化测试用例脚本的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby - 在 Ruby 中编写命令行实用程序 - 2

    我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

  3. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  4. ruby - Ruby 的 Hash 在比较键时使用哪种相等性测试? - 2

    我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的:classAattr_reader:xdefinitialize(inner)@inner=innerenddefx;@inner.x;enddef==(other)@inner.x==other.xendenda=A.new(o)#oisjustanyobjectthatallowso.xb=A.new(o)h={a=>5}ph[a]#5ph[b]#nil,shouldbe5ph[o]#nil,shouldbe5我试过==、===、eq?并散列所有无济于事。

  5. ruby - RSpec - 使用测试替身作为 block 参数 - 2

    我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere

  6. ruby - Sinatra:运行 rspec 测试时记录噪音 - 2

    Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/

  7. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  8. ruby-on-rails - 迷你测试错误 : "NameError: uninitialized constant" - 2

    我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test

  9. ruby - 即使失败也继续进行多主机测试 - 2

    我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r

  10. ruby-on-rails - 如何使辅助方法在 Rails 集成测试中可用? - 2

    我在app/helpers/sessions_helper.rb中有一个帮助程序文件,其中包含一个方法my_preference,它返回当前登录用户的首选项。我想在集成测试中访问该方法。例如,这样我就可以在测试中使用getuser_path(my_preference)。在其他帖子中,我读到这可以通过在测试文件中包含requiresessions_helper来实现,但我仍然收到错误NameError:undefinedlocalvariableormethod'my_preference'.我做错了什么?require'test_helper'require'sessions_hel

随机推荐