精华内容
下载资源
问答
  • githup地址:https://github.com/SailFan/autoTestMock包结构:common包ExtentTestNGIReporterListener.java测试报告的监听器GeneratorSqlmap.java 为mybatis逆向工程的生成类, mybatis可以使用接口的方式直接...

    githup地址:https://github.com/SailFan/autoTestMock

    包结构:

    ec7161c7606b1d1e22a53765e2cde8a1.png

    common包

    ExtentTestNGIReporterListener.java 为测试报告的监听器

    GeneratorSqlmap.java 为mybatis逆向工程的生成类, mybatis可以使用接口的方式直接调用, 也可以通过mapper映射文件(推荐使用), mybatis可以使用手写的方式手写maaper映射文件, 实体, 接口,(灵活, 要什么写什么) 也可以通过mybatis逆向工程的方式来生成mapper, entity, interface, 这样会更方便, 而且错误会更少, 缺少什么映射关系手动补上去就行。

    HttpClientTool.java HttpClient工具封装类, 上传文件的post方法未测试, 其他方法测试已通过

    MybatisUtil.java mybatis工具类, 用来获取mybatis的session工厂,获取session

    dao包

    mapper的接口以及映射文件

    entity包

    实体类

    loadurl包

    里面是用来读取测试url的工具类, 其实可以放到coomon包的, 不过啦, 包不包的无所谓了,反正也懒得改了, 放哪儿都一样

    moco包

    其实在程序中更应该使用moco api方法的, 像我这种moco standalone使用方法放着只是为了区分而已, 坦白说来, 放到这儿有点不伦不类的

    testcase包

    测试用例

    conn 目录

    mysql配置文件

    execute

    TestNg配置文件

    log包

    log4j配置文件中可以设置路径, 目录会自己生成, 使用日志在程序调错会很方便

    mybatis目录

    mybatis全局配置文件

    url目录

    测试的url路径存放在application.properties

    test-output目录

    测试报告

    generatorConfig.xml文件

    mybatis逆向工程配置文件

    我的思路,

    1 mybatis可用来查询测试环境或者生产环境数据库用来在断言,

    2 测试的数据可以放在测试库中, 取出之后封装出object[][],格式进行测试, 或者测试数据直接放到另一个数据库,反正拒绝execl, 可以考虑用sqlit,个人感觉放到生产环境或者测试环境就好了, 新建一个库, 几张表的事儿, 这儿可以避免操作多个数据库,

    优化点

    1 读出的数据没有封装, 与TestNg的@DataProvider注解没有集成,

    2 HttpClient封装的也不太好

    3 HttpClinet的返回值的处理

    4 还有很多很多

    以上用到的 TestNg+maven+mybatis+HttpClient+ extentreports+moco+sqllit+mysql,这自动化代码会持续优化, 接口全部用moco模拟

    展开全文
  • 谁说生成api文档就必须要定义注解?谁说生成接口请求和返回示例必须要在线?用代码去探路,不断尝试更多文档交付的可能性。如果代码有生命,为什么不换种方式和它对话!一、背景没有背景、就自己做自己的背景在当今...

    谁说生成api文档就必须要定义注解?

    谁说生成接口请求和返回示例必须要在线?

    用代码去探路,不断尝试更多文档交付的可能性。

    如果代码有生命,为什么不换种方式和它对话!

    一、背景

    没有背景、就自己做自己的背景

    在当今各种盛行的前后端分离、restful service开发过程中,接口文档是必不

    可少的。对于前后端分离的开发中,后端开发需要将接口写好后需要告诉前端工程师接口的请求参数、响应示例等重要信息,而对于对外暴露的restful接口服务,我们提供接口也是需要具备相同的接口文档的。

    但是对于后端工程师来讲,写接口文档将变成一个很大的工作量,虽然现在有类似apidoc、swagger这样的主流接口文档生成工具,但是如果实际用过,会发现这些工具不能满足实际需求,这里拿swagger为例,这个工具最大的优点能是提供在线的api文档,但是它天生就有很强的代码侵入性,要得到一个基本满足需求的api接口文档,必须在代码中使用swagger自定义的注解。这其实给开发人员增加学习成本和工作量,并且就算你使用大量的注解,有许多接口还是无法满足。因此不得不去做一次接口文档工具重新启航探索,smart-doc应允而生,用代码去探路,消除繁杂的注解,发现天下没有难写接口文档。

    二、smart-doc简介

    简约而不简单

    smart-doc是基于java开发用于解决java web restful接口文档书写难和生成难的问题,当然api-doc也是一款零注解完全基于源代码接口定义,使用java标准注释生成接口文档的工具。并且smart-doc代码也是完全开源的。目前生成的文档格式为markdown。

    技术交流群:170651381

    三、功能特性

    一个都不能少

    零注解、零学习成本、只需要写标准java注释。

    基于源代码接口定义自动推导

    支持springmvc、springboot

    目前支持javabean上定义的部分fastjson和jackson注解

    支持javabean上基于jsr303参数检验判断参数是否为必须

    对json请求参数的接口能够自动生成模拟json参数

    对一些常用字段定义能够生成有效的模拟值

    支持生成json返回值示例

    支持从项目外部加载源代码来生成字段注释

    一款代码注解检测工具,明眼leader都知道接口文档直接反馈出注释情况

    四、效率成效

    效率是做好工作的灵魂。——切斯特菲尔德

    直接生成模拟请求参数,提升了团队里的前端和测试的工作效率,试想你让他们去编写json请求参数,如果你不写,鬼知道是什么样。

    后端开发只需专注业务和写好标准注释,无需引入额外注解,无需自己编写请求参数示例和响应示例。

    接口文档更加标准化

    五、缺点

    只有看到自己的不足,才能获得进步。

    由于基于源代码分析生成文档,因此无法生成在线文档,需要结合地方markdown文档管理工具来管理。

    由于源代码分析难度很大,针对很多代码存在潜在的大量的bug.

    对泛型返回接口需要明确定义泛型定义,否则无法推导

    六、用例

    com.github.shalousun

    api-doc

    0.5

    6.1 定义bean

    /**

    * @author yu 2018/8/4.

    */

    public class SimpleUser {

    /**

    * 用户名

    */

    @NotNull

    private String username;

    /**

    * 密码

    */

    private String password;

    /**

    * 昵称

    */

    private String nickName;

    /**

    * 电话

    */

    private String mobile;

    }

    6.2 定义接口

    /**

    * 用户信息操作接口

    * @author yu 2018/8/4.

    */

    @RestController

    @RequestMapping("/user")

    public class UserController {

    /**

    * 添加用户

    * @param user

    * @return

    */

    @PostMapping("/add")

    public List addUser(@RequestBody SimpleUser user){

    return null;

    }

    }

    启动文档生成

    /**

    * 包括设置请求头,缺失注释的字段批量在文档生成期使用定义好的注释

    */

    @Test

    public void testBuilderControllersApi() {

    ApiConfig config = new ApiConfig();

    config.setServerUrl("http://localhost:8080");

    config.setStrict(true);

    config.setOutPath("d:\\md");

    //不指定SourcePaths默认加载代码为项目src/main/java下的,如果项目的某一些实体来自外部代码可以一起加载

    config.setSourcePaths(

    SourcePath.path().setDesc("本项目代码").setPath("src/main/java")

    // SourcePath.path().setPath("E:\\Test\\Mybatis-PageHelper-master\\src\\main\\java"),

    // SourcePath.path().setDesc("加载项目外代码").setPath("E:\\ApplicationPower\\ApplicationPower\\Common-util\\src\\main\\java")

    );

    long start = System.currentTimeMillis();

    ApiDocBuilder.builderControllersApi(config);

    long end = System.currentTimeMillis();

    DateTimeUtil.printRunTime(end, start);

    }

    生成文档

    添加用户

    Type: post

    Content-Type: application/json; charset=utf-8

    Request-parameters:

    Parameter

    Type

    Description

    Required

    username

    string

    用户名

    true

    password

    string

    密码

    false

    nickName

    string

    昵称

    false

    mobile

    string

    电话

    false

    Request-example:

    {

    "username":"瑞霖.张",

    "password":"xud2qc",

    "nickName":"rudy.goyette",

    "mobile":"15650966307"

    }

    Response-fields:

    Field

    Type

    Description

    username

    string

    用户名

    password

    string

    密码

    nickName

    string

    昵称

    mobile

    string

    电话

    Response-example:

    [

    {

    "username":"浩然.阎",

    "password":"dzlv56",

    "nickName":"kieran.herzog",

    "mobile":"17863739656"

    }

    ]

    七、未来定义

    期待下一次我们更好的相遇

    修改源代码解析的众多的bug

    收集使用者的建议,提供非json请求参数的请求示例

    收集使用者一些新增功能建议,增加一些必须功能。

    八、使用协议

    尊重别人,才能让人尊敬。——笛卡尔

    任何企业和个人不得用于申请专利

    九、使用反馈

    分享是一种生活的信念,明白了分享的同时,明白了存在的意义。

    smart-doc的发展离不开你的支持,因为出于完全的开源免费,因此您可以基于smart-doc的源码解析核心上去做一些自定义的开发来将接口文档数据接入到一些第三方的在线api文档管理系统,例如:CrapApi,但是在请使用者能有一份开源的心态和情怀,积极反馈api-doc的核心代码使用bug和提出改善意见。

    由于我个人的开发精力有限,对于是否会将smart-doc快速集成推送到第三方优秀的管理工具,短期内可能不会考虑,因此也希望使用者分享一些比较好的集成方案来供大家使用,如果方案比较符合smart-doc使用简洁的核心理念,将会直接纳入后续的版本升级中,同时源代码和方案提供者也将纳入smart-doc的开发者。

    十、祝福

    愿你编写接口无数,归来仍是少年

    展开全文
  • 它是用于单元测试框架体系xUnit的一个实例(用于java语言)。主要用于白盒测试,回归测试。个人理解:每次软件做版本迭代,为防止引入新的问题,需要对重要功能的接口进行基本功能测试。此时可以考虑做成自动化...

    转自:https://blog.csdn.net/qq_15945247/article/details/78791017

    JUnit是一个开发源代码的Java测试框架,用于编写和运行可重复的测试。它是用于单元测试框架体系xUnit的一个实例(用于java语言)。主要用于白盒测试,回归测试。

    个人理解:每次软件做版本迭代,为防止引入新的问题,需要对重要功能的接口进行基本功能测试。此时可以考虑做成自动化(在版本迭代较快,主要功能基本不变化的接口适用)

    eclipse中使用JUnit(JUnit3)

    之前本人测试使用JUnit3,目前JUnit4已经普及。JUnit 4是与JUnit3完全不同的API,它基于Java 5.0中的注解、静态导入等构建而成。JUnit 4更简单、更丰富、更易于使用,并引入了更为灵活的初始化和清理工作,还有限时的和参数化测试用例

    在eclipse中新建工程,然后在configure build path中导入junit jar包,在eclipse的工程中引入Junit lib库,然后可以创建Junit Test Case或者Junit Test Suite

    eb5ab8aeb0ad07f7394676392caeb3be.png

    接口测试用例

    这里展示测试用例的编写过程

    测试要求

    某数据平台提供接口给第三方使用,第三方根据接口托管自己的数据。需要测试平台提供的所有对外接口的功能,确保正常

    准备工作

    获取提供给第三方的Api(jar包形式),在eclipse中新建工程,导入该jar包,导入JUnit包,新建package,针对每个方法创建对应的测试类等,如下图所示

    e2d9060c4a288eced2eae6bb0ee81565.png

    目录结构及类说明

    在cn.cstor.wwy.test存放测试类,每个方法对应一个测试类,比如平台提供AddDevice接口,所以要新建一个TestAddDevice类,在TestAddDevice类中存在多个测试方法

    package cn.cstor.wwy.test;

    import cn.cstor.wwy.test.util.Count;

    import java.io.UnsupportedEncodingException;

    import org.apache.thrift.TException;

    import cn.cstor.wwy.test.util.Const;

    import cn.cstor.wwy.test.util.CustomString;

    import cproc.datacube.client.api.ClientBaseApi;

    import cproc.datacube.client.api.ClientBaseApiService;

    import cproc.datacube.client.api.ClientDevelopApi;

    import cproc.datacube.client.api.ClientDevelopApiService;

    import cproc.datacube.client.entity.AppInfo;

    import cproc.datacube.client.entity.DeviceConditionInfo;

    import cproc.datacube.client.entity.ReObject;

    import cproc.datacube.client.entity.UserInfo;

    import junit.framework.TestCase;

    import java.lang.Math;

    //addDevice

    public class TestAddDevice extends TestCase{

    CustomString cString = new CustomString();

    AppInfo app = new AppInfo();

    UserInfo user = new UserInfo();

    ClientDevelopApi deveApi = new ClientDevelopApiService();

    ClientBaseApi baseApi = new ClientBaseApiService();

    Count ct = new Count();

    int startct = 0;

    int endct = 0;

    protected void setUp() throws UnsupportedEncodingException, TException

    {

    user.setUserName(Const.USERNAME);

    user.setAccessId(Const.CERTIFICATE);

    app.setAppId(Const.APPID);

    app.setUserInfo(user);

    }

    protected void tearDown() throws TException

    {

    }

    //正常用例

    public void testAddDevice() throws TException

    {

    //设置设备信息

    startct = ct.getPoint();

    DeviceConditionInfo deviceCon = new DeviceConditionInfo();

    int x = (int)(Math.random()*Math.random()*Math.random()*1000000);

    deviceCon.setDeviceid("device" + x);

    deviceCon.setDip("192.168.10.1");

    deviceCon.setServicecode("1");

    deviceCon.setVrs("v0.1");

    ReObject reObject = deveApi.addDevice(app,deviceCon);

    endct = ct.getPoint();

    System.out.println(startct);

    System.out.println(endct);

    assertEquals(true,reObject.isSuccess());

    assertEquals(startct - 1,endct);

    }

    //设备名为空

    public void testAddDeviceNullDevId() throws TException

    {

    startct = ct.getPoint();

    DeviceConditionInfo deviceCon = new DeviceConditionInfo();

    deviceCon.setDeviceid("");

    deviceCon.setDip("192.168.10.1");

    deviceCon.setServicecode("1");

    deviceCon.setVrs("v0.1");

    ReObject robj = deveApi.addDevice(app,deviceCon);

    endct = ct.getPoint();

    assertEquals(false,robj.isSuccess());

    assertEquals("查询条件不足",robj.getMsg());

    assertEquals(startct,endct);

    }

    //设备名称太长

    public void testAddDeviceLongDevName() throws TException

    {

    startct = ct.getPoint();

    DeviceConditionInfo deviceCon = new DeviceConditionInfo();

    String devid = cString.generateString(200);

    deviceCon.setDeviceid(devid);

    deviceCon.setDip("192.168.10.1");

    deviceCon.setServicecode("1");

    deviceCon.setVrs("v0.1");

    ReObject reObject = deveApi.addDevice(app,deviceCon);

    endct = ct.getPoint();

    assertEquals(false,reObject.isSuccess());

    assertEquals("插入数据失败!",reObject.getMsg());

    assertEquals(startct,endct);

    }

    //ip地址为空

    public void testAddDeviceNullIP() throws TException

    {

    //设置设备信息

    startct = ct.getPoint();

    DeviceConditionInfo deviceCon = new DeviceConditionInfo();

    int x = (int)(Math.random()*Math.random()*Math.random()*1000000);

    deviceCon.setDeviceid("device" + x);

    deviceCon.setDip("");

    deviceCon.setServicecode("1");

    deviceCon.setVrs("v0.1");

    ReObject reObject = deveApi.addDevice(app,deviceCon);

    endct = ct.getPoint();

    assertEquals(true,reObject.isSuccess());

    assertEquals(startct - 1,endct);

    }

    //ip格式不正确

    public void testAddDeviceWrongIP() throws TException

    {

    //设置设备信息

    startct = ct.getPoint();

    DeviceConditionInfo deviceCon = new DeviceConditionInfo();

    int x = (int)(Math.random()*Math.random()*Math.random()*1000000);

    deviceCon.setDeviceid("device" + x);

    deviceCon.setDip("123.12.25.23.212");

    deviceCon.setServicecode("1");

    deviceCon.setVrs("v0.1");

    ReObject reObject = deveApi.addDevice(app,deviceCon);

    endct = ct.getPoint();

    assertEquals(true,reObject.isSuccess());

    assertEquals(startct - 1,endct);

    }

    }

    在cn.cstor.wwy.test.util中存放一些常量信息

    Const.java:存放用户认证信息,应用信息,测试创建表名

    package cn.cstor.wwy.test.util;

    public interface Const {

    // user info

    String USERNAME = "shenpp";

    String CERTIFICATE = "C2HLBNBWMTUWMDI1NDCXNTI2MQ==";

    String APPID = "0542051559";

    String TABLENAME="CREATEBYINTERFACE";

    }

    Count.java:获取积分方法 //测试需要对比积分,但是没有借口查询,只能通过web页面查询,故增加该方法

    package cn.cstor.wwy.test.util;

    public class Count {

    public int getPoint()

    {

    int count = 0;

    String url = "http://192.168.10.105:8080/queryPointsForTest?uid=3450&accessid=C2HLBNBWMTUWMDI1NDCXNTI2MQ==";

    try

    {

    String result = HttpUtil.getHttpContent(url,"");

    String[] res1 = result.split(":");

    String[] res2 = res1[1].split("}");

    count = Integer.valueOf(res2[0]).intValue();

    } catch (Exception e)

    {

    e.printStackTrace();

    }

    return count;

    }

    }

    CustomString.java :生成一段随机字符串,测试使用

    package cn.cstor.wwy.test.util;

    import java.util.Random;

    public class CustomString {

    public String generateString(int clength) {

    String base = "abcdefghijklmnopqrstuvwxyz";

    Random random = new Random();

    StringBuffer sb = new StringBuffer();

    for (int i = 0; i < clength; i++) {

    int number = random.nextInt(base.length());

    sb.append(base.charAt(number));

    }

    return sb.toString();

    }

    }

    HttpUtil.java :设置http访问的参数

    package cn.cstor.wwy.test.util;

    import java.io.*;

    import java.net.HttpURLConnection;

    import java.net.URL;

    public class HttpUtil {

    public static String getHttpContent(String url,String parameterData ) throws Exception {

    HttpURLConnection connection = null;

    // String content = "";

    OutputStream outputStream = null;

    OutputStreamWriter outputStreamWriter = null;

    InputStream inputStream = null;

    InputStreamReader inputStreamReader = null;

    BufferedReader reader = null;

    StringBuffer resultBuffer = new StringBuffer();

    String tempLine = null;

    try {

    URL address_url = new URL(url);

    connection = (HttpURLConnection) address_url.openConnection();

    connection.setRequestMethod("POST");

    connection.setDoOutput(true);

    connection.setDoInput(true);

    connection.setRequestProperty("accept", "*/*");

    connection.setRequestProperty("Accept-Charset", "utf-8");

    connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

    connection.setRequestProperty("Content-Length", String.valueOf(parameterData.length()));

    //设置访问超时时间及读取网页流的超市时间,毫秒值

    System.setProperty("sun.net.client.defaultConnectTimeout","3000");

    System.setProperty("sun.net.client.defaultReadTimeout", "3000");

    outputStream = connection.getOutputStream();

    outputStreamWriter = new OutputStreamWriter(outputStream);

    outputStreamWriter.write(parameterData);

    outputStreamWriter.flush();

    if (connection.getResponseCode() >= 300) {

    throw new Exception("HTTP Request is not success, Response code is " + connection.getResponseCode());

    }

    inputStream = connection.getInputStream();

    inputStreamReader = new InputStreamReader(inputStream);

    reader = new BufferedReader(inputStreamReader);

    while ((tempLine = reader.readLine()) != null) {

    resultBuffer.append(tempLine);

    }

    }finally {

    if(connection !=null){

    connection.disconnect();

    }

    }

    return resultBuffer.toString();

    }

    }

    自动化测试

    我所理解的接口自动化测试就是能一次性执行上述编写的所有测试类的测试方法,如此可以通过如下方法实现:

    在cn.cstor.wwy.test包中新建JUnit Test Suite,名称为TestAll

    import junit.framework.Test;

    import junit.framework.TestSuite;

    public class TestAll {

    public static Test suite() {

    TestSuite suite = new TestSuite(AllTests.class.getName());

    //$JUnit-BEGIN$

    //$JUnit-END$

    return suite;

    }

    }

    在中间加入所有的测试类,这样执行TestAll.java就能执行所有接口的测试用例

    package cn.cstor.wwy.test;

    import junit.framework.Test;

    import junit.framework.TestSuite;

    public class TestAll {

    public static Test suite() {

    TestSuite suite = new TestSuite(TestAll.class.getName());

    suite.addTestSuite(TestGetAllAppDevices.class);

    suite.addTestSuite(TestCreateTable.class);

    suite.addTestSuite(TestGetTableInfo.class);

    suite.addTestSuite(TestAddTableColumns.class);

    suite.addTestSuite(TestAddTableRows.class);

    suite.addTestSuite(TestDeleteTableRows.class);

    suite.addTestSuite(TestGetTableRowsByDeveApi.class);

    suite.addTestSuite(TestGetTableRowsByBaseApi.class);

    suite.addTestSuite(TestGetAllTableInfo.class);

    suite.addTestSuite(TestGetTopOneResult.class);

    suite.addTestSuite(TestGetTableRowsByRange.class);

    suite.addTestSuite(TestGetTableRowsByPKRange.class);

    suite.addTestSuite(TestGetTableRowsByNewPageCondition.class);

    suite.addTestSuite(TestDeleteTable.class);

    suite.addTestSuite(TestAddDevice.class);

    suite.addTestSuite(TestGetDeviceTopOneResult.class);

    suite.addTestSuite(TestGetDevsStatisticWithTimeDivision.class);

    suite.addTestSuite(TestGetHardWareStatisticWithTimeDivision.class);

    // suite.addTestSuite(TestGetQueryResult.class);

    suite.addTestSuite(TestGetServerCurrentTime.class);

    suite.addTestSuite(TestGetStatisticByColumn.class);

    suite.addTestSuite(TestGetTableRowsByPage.class);

    suite.addTestSuite(TestQueryDeviceDataAvgValues.class);

    suite.addTestSuite(TestQueryLongitudeLatitude.class);

    return suite;

    }

    }

    常用的测试注解和方法(JUnit4)

    @BeforeClass 在测试类被调用前执行,一个测试类中声明一次,执行一次

    @AfterClass 在测试类调用结束后执行,一个测试类中声明一次,执行一次

    @Before 在每个@Test(测试方法)调用前执行 //Junit3中的setup方法

    @After 在每个@Test调用后执行 //Junit3中的teardown方法

    @Test 使用此注解的方法是一个单元测试用例

    @Ignore 暂时不执行的测试方法

    @Test(timeout = 2000) //用例执行时间不能超过2s

    @Test(expected = ArithmeticException.class) //此方法执行后,必须抛出ArithmeticException才能认为测试执行成功

    assert //包含此关键字的为断言方法

    使用TestNG

    使用TestNG需要在eclipse中安装TestNG插件

    在eclipse界面选择“Help”–“install New Software”,选择【Add】,在location中输入http://beust.com/eclipse,选择TestNG,点击【Next】,开始下载安装。安装完成后,选择“Build Path”“Configure Build Path”,在“Task Repository”下有“TestNG”标签。安装成功。(此方法如果eclipse版本或者以前是否安装卸载过的不同会造成此方法成功率很小);

    在eclipse界面选择“Help”–“Eclipse Marketplace”中进行查找TestNG 然后进“install” 。(此方法最简便,力荐。);

    TestNG需要使用testng.xml配置层级结构

    1、TestSuite由一个或多个Test组成

    2、Test由一个或多个测试Class组成

    3、一个测试Class由一个或多个测试方法组成

    ......

    TestNG常用注解

    @BeforeSuite //在当前测试集合的任意测试用例开始前执行

    @AfterSuite //在当前测试集合的所以测试用例结束后执行

    @BeforeTest //……

    @AfterTest

    @BeforeGroups

    @AfterGroups

    @BeforeClass

    @AfterClass

    @BeforeMethod

    @AfterMethod

    @Test

    给测试方法分组

    @Test (groups = {“xx1”}) @Test (groups = {“xx2”})

    调用单个分组testng.xml

    调用多个分组testng.xml

    依赖测试

    @Test (dependsOnMethods = {“testMethod2”}) //可以保证先执行testMethod2再执行该方法

    特定顺序执行测试用例

    @Test (priority = 1) //priority从0开始,0优先级最高

    跳过摸个测试方法

    @Test (priority = 1,enabled=false)

    测试报告中的自定义日志

    方法中增加 Reporter.log(“打印日志”) 打印出来的日志会在TestNG测试报告中

    @Parameters(“browser”) 定义browser参数,在测试执行过程中,此参数的具体值由testng.xml中的

    配置来传递给测试程序

    参考:https://blog.csdn.net/wanglha/article/details/50331577

    https://testerhome.com/topics/10525

    https://blog.csdn.net/do_your_self_thing/article/details/6247834

    展开全文
  • 1.-测试结果1.1-成功,失败和断言测试被认为是成功的,如果它不引发任何异常完成,还是它扔的预期异常(请参阅文档expectedExceptions属性上找到的@Test注释)。您的测试方法通常由可能引发异常的调用或各种断言(使用...

    1.-测试结果

    1.1-成功,失败和断言

    测试被认为是成功的,如果它不引发任何异常完成,还是它扔的预期异常(请参阅文档expectedExceptions属性上找到的@Test注释)。

    您的测试方法通常由可能引发异常的调用或各种断言(使用Java“ assert”关键字)组成。“断言”失败将触发AssertionErrorException,这反过来会将方法标记为失败(如果未看到断言错误,请记住在JVM上使用-ea)。

    这是一个示例测试方法:

    /***@author北京-宏哥

    *

    * Java自动化测试框架-10 - TestNG之 测试结果篇

    *

    * 2019年11月9日*/@Testpublic voidverifyLastName() {assert "Beust".equals(m_lastName) : "Expected name Beust, for" +m_lastName;

    }

    TestNG还包括JUnit的Assert类,该类使您可以对复杂对象执行断言:

    /***@author北京-宏哥

    *

    * Java自动化测试框架-10 - TestNG之 测试结果篇

    *

    * 2019年11月9日*/

    import static org.testng.AssertJUnit.*;//...

    @Testpublic voidverify() {

    assertEquals("Beust", m_lastName);

    }

    请注意,上面的代码使用静态导入,以便能够使用 assertEquals方法而不必在其类之前添加前缀。

    1.2-日志和结果

    测试运行的结果在启动SuiteRunner时指定的目录中的index.html文件中创建。该文件指向包含整个测试运行结果的各种其他HTML和文本文件。

    使用TestNG与监听器和报告器生成自己的报告非常容易:

    侦听器实现org.testng.ITestListener接口,并在测试开始,通过,失败等时实时通知。

    报告程序实现org.testng.IReporter接口,并在TestNG已运行所有套件时收到通知。IReporter实例接收描述整个测试运行的对象列表。

    例如,如果要生成测试运行的PDF报告,则无需实时通知测试运行,因此您应该使用IReporter。如果您想编写测试的实时报告,例如带有进度条的GUI或在每次测试被调用时显示点(“。”)的文本报告程序(如下所述),则ITestListener是您的最好的选择。

    1.2.1-日志侦听器

    这是一个显示“。”的侦听器。对于每个通过的测试,对于每个失败,都为“ F”,对于每个跳过均为“ S”:

    /***@author北京-宏哥

    *

    * Java自动化测试框架-10 - TestNG之 测试结果篇

    *

    * 2019年11月9日*/

    public class DotTestListener extendsTestListenerAdapter {private int m_count = 0;

    @Overridepublic voidonTestFailure(ITestResult tr) {

    log("F");

    }

    @Overridepublic voidonTestSkipped(ITestResult tr) {

    log("S");

    }

    @Overridepublic voidonTestSuccess(ITestResult tr) {

    log(".");

    }private voidlog(String string) {

    System.out.print(string);if (++m_count % 40 == 0) {

    System.out.println("");

    }

    }

    }

    在此示例中,我选择扩展TestListenerAdapter,该方法使用空方法实现ITestListener,因此我不必从我不感兴趣的接口中覆盖其他方法。您可以根据需要直接实现该接口。

    这是我调用TestNG来使用此新侦听器的方法:

    java -classpath testng.jar;%CLASSPATH% org.testng.TestNG -listener org.testng.reporters.DotTestListener test\testng.xml

    和输出:

    ........................................

    ........................................

    ........................................

    ........................................

    ........................................

    .........................===============================================TestNG JDK1.5Total tests run:226, Failures: 0, Skips: 0

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

    请注意,当您使用-listener时,TestNG将自动确定您要使用的侦听器的类型。

    1.2.2-日志记者

    该org.testng.IReporter接口只有一个方法:

    public void generateReport(List suites, String outputDirectory)

    当所有套件都已运行时,TestNG将调用此方法,您可以检查其参数以访问刚刚完成的运行中的所有信息。

    1.2.3-JUnitReports

    TestNG包含一个侦听器,该侦听器获取TestNG结果并输出一个XML文件,然后可以将其馈送到JUnitReport。 这是一个示例,以及创建此报告的ant任务:

    注意:JDK 1.5和JUnitReports当前不兼容,无法使用框架版本,因此您需要指定“ noframes”才能使其正常工作。

    1.2.4-Reporter API

    如果需要日志应在生成的HTML报告中显示的消息,则可以使用org.testng.Reporter类:

    Reporter.log (“已呼叫M3” );

    b2e34137148844a38a6136b35ad2dd6e.png     

    4b5819839621b06cc8068d56690a1137.png

    1.2.5-XML报告

    TestNG提供了一个XML报告程序,用于捕获JUnit报告中不提供的TestNG特定信息。当用户的测试环境需要使用JUnit格式无法提供的具有TestNG特定数据的XML结果时,此功能特别有用。记者可以通过使用命令行注入TestNG的-reporter。

    这是一个示例用法:-reporter org.testng.reporters.XMLReporter:generateTestResultAttributes = true,generateGroupsAttribute = true。

    下表详细介绍了可以传递的所有选项。确保使用:

    : -将报告者名称与其属性分开

    = -分隔属性的键/值对

    , -分隔多个键/值对

    以下是此类报告器的输出示例:

    ... Removed 22 stack frames]]>

    该报告程序与其他默认侦听器一起注入,因此默认情况下您可以获得这种类型的输出。侦听器提供了一些属性,可以对报告器进行调整以满足您的需求。下表包含这些属性的列表,并附有简短说明:

    Property

    Comment

    Default value

    outputDirectory

    A String indicating the directory where should the XML files be output.

    The TestNG output directory

    timestampFormat

    Specifies the format of date fields that are generated by this reporter

    yyyy-MM-dd'T'HH:mm:ss'Z'

    fileFragmentationLevel

    An integer having the values 1, 2 or 3, indicating the way that the XML files are generated:

    1 - will generate all the results in one file.

    2 - each suite is generated in a separate XML file that is linked to the main file.

    3 - same as 2 plus separate files for test-cases that are referenced from the suite files.

    1

    splitClassAndPackageNames

    This boolean specifies the way that class names are generated for the  element. For example, you will get  for false and  for true.

    false

    generateGroupsAttribute

    A boolean indicating if a groups attribute should be generated for the  element. This feature aims at providing a straight-forward method of retrieving the groups that include a test method without having to surf through the  elements.

    false

    generateTestResultAttributes

    A boolean indicating if an  tag should be generated for each  element, containing the test result attributes (See ITestResult.setAttribute() about setting test result attributes). Each attribute toString() representation will be written in a  tag.

    false

    stackTraceOutputMethod

    Specifies the type of stack trace that is to be generated for exceptions and has the following values:

    0 - no stacktrace (just Exception class and message).

    1 - a short version of the stack trace keeping just a few lines from the top

    2 - the complete stacktrace with all the inner exceptions

    3 - both short and long stacktrace

    2

    generateDependsOnMethods

    Use this attribute to enable/disable the generation of a depends-on-methods attribute for the  element.

    true

    generateDependsOnGroups

    Enable/disable the generation of a depends-on-groups attribute for the  element.

    true

    为了配置此报告程序,可以在命令行中使用-reporter选项,也可以将Ant 任务与嵌套的元素一起使用。对于其中的每个,您都必须指定org.testng.reporters.XMLReporter类。请注意,您无法配置内置报告器,因为该报告器仅使用默认设置。如果只需要

    带有自定义设置的XML报告,则必须使用两种方法之一手动添加它并禁用默认侦听器。

    1.2.6-TestNG退出代码

    当TestNG完成执行时,它将退出并返回代码。

    可以检查此返回码以了解故障的性质(如果有的话)。

    下表总结了TestNG当前使用的不同退出代码。

    FailedWithinSuccess

    Skipped

    Failed

    Status Code

    Remarks

    No

    No

    No

    0

    Passed tests

    No

    No

    Yes

    1

    Failed tests

    No

    Yes

    No

    2

    Skipped tests

    No

    Yes

    Yes

    3

    Skipped/Failed tests

    Yes

    No

    No

    4

    FailedWithinSuccess tests

    Yes

    No

    Yes

    5

    FailedWithinSuccess/Failed tests

    Yes

    Yes

    No

    6

    FailedWithinSuccess/Skipped tests

    Yes

    Yes

    Yes

    7

    FailedWithinSuccess/Skipped/Failed tests

    2.-小结

    好了,今天关于TestNG之测试结果,就分享到这里。

    展开全文
  • 首先,一般做java服务端都用过postman,并且都写过前端调用的api文档接口,并且也用过市面上的一些工具。 API自文档动生成,能够省去了写文档的时间。...增加了java代码注释自动生成API文档,基本上不用怎么
  • 如何写Java单元测试

    千次阅读 2021-01-19 10:23:06
    什么是单元测试  我们在编写大型程序的时候,需要写成千上万个方法或函数,这些函数的功能可能很强大,但我们在程序中只用到该函数的一小部分功能,并且经过调试可以确定,这一小部分功能是正确的。但是,我们同时...
  • java基础之:java注解

    2021-03-14 02:18:21
    一:元注解注解的作用就是负责注解...Java5.0定义的元注解:1.@Target,2.@Retention,3.@Documented,4.@Inherited这些类型和它们所支持的类在java.lang.annotation包中可以找到。下面我们看一下每个元注解的作用...
  • 前言:这两天在整WebApi的服务,由于调用方是Android客户端,Android开发人员也不懂C#语法,API里面的接口也不能直接给他们看,没办法,只有整个详细一点的文档呗。由于接口个数有点多,每个接口都要详细说明接口...
  • JAVA spring mvc 项目单元测试基类及单元测试自动生成工具类测试类基类测试基类用例单元测试类生成工具类 测试类基类 package com.fzy.gdaba.test.web.utils; import ...
  • 目录 Junit单元测试 反射 反射的原理: 获取Class对象的方法(三个不同的阶段,三种不同的方法) ...注解 ...JDK预定义注解 ...自定义注解 ...Junit单元测试 ...测试分类: 1....Junit单元测试是白盒测试...
  • Java系列之注解

    千次阅读 2021-03-09 20:52:03
    Java 注解(Annotation)又称之为 Java 标注、元数据,是 Java 1.5 之后加入的一种特殊语法,通过注解可以标注 Java 中的类、方法、属性、参数、包等,可以通过反射原理对这些元数据进行访问,注解的使用不会影响程序...
  • JApiDocs是一个无需额外注解、开箱即用的SpringBoot接口文档生成工具。...最佳实践是:先把接口设计好,在Mock的方法上写注释来生成API文档,这样做到前后端根据API文档并行开发。为什么引入JApiDocs相比S...
  • 软件介绍smart-doc是一个java restful api文档生成工具,smart-doc颠覆了传统类似swagger这种大量采用注解侵入来生成文档的实现方法。smart-doc完全基于接口源码分析来生成接口文档,完全做到零注解侵入,你只需要...
  • 1什么是Junit测试:是白盒测试的一种(白盒测试更高级一些) ​​​​​​​ 2怎么使用Junit类:
  • java-api-doc励志做java届最好的文档生成工具,自动解析代码生成api接口文档,前后台分离开发的福音,零代码入侵,零注释入侵解决的痛点通常的文档生成工具,都需要开发人员编写注解注释,代码入侵太强,而且费事...
  • (1)\1.web前端;目录中文件数:5个├─1.开学典礼.mp4├─2....前端知识-dom编程.mp4(2)\2.Java基础;目录中文件数:32个├─10.循环控制语句(for,while).mp4├─11.条件控制语句(switch case,if else)...
  • hibernate 里面通过注解,映射等手段,可以自动生成表,现在模拟实现。随便学学注解如何使用。首先,我们要定义几个注解:Table 用于定义表名字,类型使用Typeimport java.lang.annotation.ElementType;import java....
  • 一个main方法只能测试一个方法,测试另一个方法需要注释掉其余方法,防止干扰。 测试类要和被测试类要放在同一个包内,不方便管理测试代码 public class CalculatorTest { public static void main(Strin
  • 同时将单元测试提前到编写正式代码进行(测试驱动开发),可以很好的提高对代码结构的设计。通过优先编写测试用例,可以很好的从用户角度来对功能的分解、使用过程和接口等进行设计,从而提高代码结构的高内聚、低耦合...
  • javaapi查看器

    2021-04-17 04:18:50
    java上传在线浏览文档... ...eoLinker-API Shop 京东热词查询 Java 调用示例代码京东热词查询 京东商品关键词搜索排名查询工具,可根据任意商品关键词,全站实时获取,搜索 关注度最高的商品关键词......3145884987a |...
  • 持续实例化via构造函数(修改了异常处理) Spring 5.0框架自带了通用的日志封装 spring-jcl替代了通用的日志,仍然支持可重写 自动检测log4j 2.x, SLF4J, JUL(java.util.Logging)而不是其他的支持 访问Resuouce时...
  • 简介WeTest是处理API接口测试的轻量级自动测试框架,java语言实现,拓展JUnit4开源框架,支持Ant/Maven执行方式。工具特点:1.支持suite,根据JUnit4测试类名正则匹配,聚合相同模块的用例,运行单个聚合类即可...
  • 本地下载源码:E:\JavaCode\java-API签名校验 2:该jar 包操作说明 本仓库包含以下内容: 签名校验的源码 基于Spring boot的web示例 由于要开放接口供第三方调用, 采用签名校验的方式以保证安全, 于是有了这个...
  • 我来介绍通过代码逐步实现接口自动测试框架的设计过程。先不要着急,框架设计我们只是介绍基本的组件,而且框架设计没有想象那么难,一步一步跟着做就会了。这篇我们来演示,如果通过Java代码来实现一个用纯代码...
  • 单元测试编写Junit 单元测试框架对于Java语言而言,其单元测试框架,有Junit和TestNG这两种,下面是一个典型的JUnit测试类的结构package com.example.demo;import org.junit.jupiter.api.*;import static org.junit....
  • Java 注解 Annotation

    2021-03-14 19:20:26
    目录:从 JDK5 开始,Java 增加了对元数据(MetaData)的支持,也就是 Annotation。Annotation 其实就是代码里面的特殊标记,这些标记可以在编译、类加载、运行时被读取,并执行相应的处理。通过使用注解,开发人员...
  • 下面给各位扩展一些JAVA开发中常用的API 文档注释(ApiDoc): import javax.crypto.spec.PSource; 文档注释是功能级注释,只在三个地方使用,分别是:类,方法,常量上 文档注释可以通过javadoc命令生成手册 在类上...
  • 原文:http://blog.csdn.net/robertcpp/article/details/51628656经过测试即便生成文件也该是运行时才能生成。在开始之前,我们首先申明一个非常重要的问题:我们并不讨论那些在运行时(Runtime)通过反射机制运行处理...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 104,372
精华内容 41,748
关键字:

java自动测试api注解

java 订阅