TestNG使用总结
TestNG简介:
TestNG是一个测试框架,其灵感来自JUnit和NUnit,但同时引入了一些新的功能,使其功能更强大,使用更方便。
TestNG相较于Junit的优点:
·可指定执行顺序, dependsOnMethods 属性来应对测试的依赖性问题。
·参数化测试,TestNG 提供了开箱即用的类似特性。通过在 TestNG 的 XML 配置文件中放入参数化数据,就可以对不同的数据集重用同一个测试用例,甚至有可能会得到不同的结果。支持@DataProvider 注释可以方便地把复杂参数类型映射到某个测试方法。
·支持分组测试
·支持多线程测试
官网地址:http://testng.org/doc/index.html
引入依赖:
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.8</version>
</dependency>
TestNG用法简介:
注解 | 描述 |
---|---|
@BeforeSuite | 注解的方法将只运行一次,所有测试运行前运行。 |
@AfterSuite | 注解的方法将只运行一次,,所有测试运行后运行。 |
@BeforeClass | 注解的方法将只运行一次,被注释的方法将在当前类的第一个测试方法调用前运行。 |
@AfterClass | 注解的方法将只运行一次,被注释的方法将在当前类的最后一个个测试方法调用后运行。 |
@BeforeTest | 被注释的方法将在所有测试方法运行前运行 |
@AfterTest | 被注释的方法将在所有测试方法运行后运行 |
@BeforeGroups | 组的列表,这种配置方法将之前运行。此方法是保证在运行属于任何这些组第一个测试方法,该方法被调用。 |
@AfterGroups | 组的名单,这种配置方法后,将运行。此方法是保证运行后不久,最后的测试方法,该方法属于任何这些组被调用。 |
@BeforeMethod | 注解的方法将每个测试方法之前运行。 |
@AfterMethod | 被注释的方法将被运行后,每个测试方法。 |
@DataProvider | 标志着一个方法,提供数据的一个测试方法。注解的方法必须返回一个Object[] [],其中每个对象[]的测试方法的参数列表中可以分配。该@Test 方法,希望从这个DataProvider的接收数据,需要使用一个dataProvider名称等于这个注解的名字。 |
@Factory | 作为一个工厂,返回TestNG的测试类的对象将被用于标记的方法。该方法必须返回Object[]。 |
@Listeners | 定义一个测试类的监听器。 |
@Parameters | 介绍如何将参数传递给@Test方法。 |
@Test | 标记一个类或方法作为测试的一部分。 |
生命周期:
@BeforeSuite->@BeforeTest->@BeforeClass->{@BeforeMethod->@Test->@AfterMethod}->@AfterClass->@AfterTest->@AfterSuite
分组测试
相比junit的TestCase/TestSuite,TestNG有suite/test/test method三个级别,即将test/test method明确区分开了。
* suite由xml文件描述。它包含一个或多个测试并被定义为标签
* test由描述并包含一个或者多个TestNG类
* TestNG类是包含至少一个TestNG annotation的java类,由标签描述并包含一个或多个测试方法
测试类:
public class QueryTest {@Test(groups = {"functest", "checkintest"})public void testMethod1() {System.out.println("groups = { functest, checkintest }");}@Test(groups = {"functest", "checkintest"})public void testMethod2() {System.out.println("groups = { functest, checkintest }");}@Test(groups = {"functest"})public void testMethod3() {System.out.println("groups = { functest }");}@Test(groups = {"checkintest"})public void testMethod4() {System.out.println("groups = { checkintest }");}
}
testng.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="framework_testng"><test verbose="2" name="TestGroups"><groups><run><include name="functest" /><exclude name="checkintest" /></run></groups><classes><class name="QueryTest" /></classes></test>
</suite>
意思就是执行QueryTest类中group带functest,排除checkintest的方法;
依赖执行
用例间依赖关系,按序执行:
public class DependsTest {@Test
public void setupEnv(){
System.out.println("this is setup Env");
}
//setupEnv()方法须在testMessage()方法前执行
@Test(dependsOnMethods = {"setupEnv"})
public void testMessage(){
System.out.println("this is test message");
}
}
参数化测试
TestNG提供了2种传递参数的方式。
第一种: testng.xml 方式使代码和测试数据分离,方便维护,适用于一个用例,需要多个相同参数(值不同)来验证的情况。
第二种:@DataProvider能够提供比较复杂的参数。
这里介绍下第一种,如下例:@Parameters({ “key” }) 会去testng.xml里取到这个key对应的value,放到传参secondName中。
public class TestngParameters { // @Parameters注解内对应的参数名称和配置文件中的key必须是相同 @Parameters({ "key" }) @Test public void testSingleString(String secondName) { System.err.println("Invoked testString " + secondName); assert "Cedric".equals(secondName); }
对应的testng.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Suite1"><parameter name="key" value="Tank" /><parameter name="key" value="Xiao" /><test name="test12"><classes><class name="ClassName" /></classes></test
</suite>
异常处理
TestNG通过@Test(expectedExceptions) 来判断期待的异常, 并且判断Error Message
e.g:@Test(expectedExceptions =IllegalArgumentException.class, expectedExceptionsMessageRegExp=”NullPoint”)
忽略测试:
@Test(enable = false), 来禁用此测试用例
多线程运行:
@Test(threadPoolSize = 3, invocationCount = 10,timeout = 3000)
invocationCount—-表示执行的次数
threadPoolSize—–表示线程池的内线程的个数
timeOut——-超时时间-毫秒
TestNG常用断言:
导入Assert包:
import static org.testng.Assert.*;
(1) assertTrue:判断是否为True。
(2) assertFalse:判断是否为false。
(3) assertSame:判断引用地址是否相同。
(4) assertNotSame:判断引用地址是否不相同。
(5) assertNull:判断是否为null。
(6) assertNotNull:判断是否不为null。
(7) assertEquals:判断是否相等,Object类型的对象需要实现haseCode及equals方法。
(8) assertNotEquals:判断是否不相等。
(9) assertEqualsNoOrder:判断忽略顺序是否相等。
相关文章:
idea常用技巧收集
idea相比eclipse的优点我在这里就不赘述了,更多参考:idea官网,本文重点讲下自己在idea使用过程中常用的一些技巧,以后随时更新…… 主要分成三大块: 1. 系统设置 2. 快捷键 3. 其他设置 系统设置 主题风格设置:默…...

初识spring RestTemplate
《spring实战》读书笔记之初识spring RestTemplate。首先需要先了解下什么是REST。 REST:官方解释,表述性状态转移。 感觉还是不知所云,参考下怎样用通俗的语言解释REST,以及RESTful? 即URL定位资源,用H…...

接口测试那些事儿
什么是接口? 首先,在讲接口测试之前,我们先要搞清楚接口类型的概念。 接口:可能是系统与系统(包括服务与服务)之间的调用,像A系统(服务)给B系统(服务&#x…...

mysql重置Root密码
方法一: 在my.ini的[mysqld]字段加入: skip-grant-tables 重启mysql服务,这时的mysql不需要密码即可登录数据库 然后进入mysql mysql>use mysql; mysql>更新 user set passwordpassword(新密码) WHERE Userroot; mysql>flush privileges; 运…...

每天一个adb命令:wm命令详解
wm命令可以用于获取屏幕分辨率、像素密度等。 前提:Android4.3及以上 usage: wm [subcommand] [options]wm size [reset|WxH]wm density [reset|DENSITY]wm overscan [reset|LEFT,TOP,RIGHT,BOTTOM]wm size: return or override display size.wm density: overrid…...

idea插件开发入门
前言:最近想研究一款自动在idea中定位缺陷及发送JIRA的快捷工具,方便提升报自动化脚本的bug的效率。因为idea插件学习是必不可少了,沉淀小结如下。 idea插件开发入门插件用途工程创建配置文件Action实现开发语法常用对象常用方法运行效果打包…...
基于数据驱动的接口自动化测试解决方案
总结一下我么项目中使用的基于数据驱动的接口自动化测试解决方案,仅供大家参考。1.接口框架设计结构 2.接口测试脚本设计原则 3.持续集成 这块用jenkins就可以了,就不介绍了,目前我们项目的集成规则介绍一下: 1.脚本job与应用对…...

spring boot深入及启动原理探究
围绕spring boot 的优点,本文我们来探究一下spring boot具体是如何实现这些特性的。 自动配置:针对很多Spring应用程序和常见的应用功能,Spring boot能自动提供相关配置;起步依赖:告诉Spring boot需要什么功能,它就能引…...

JfreeChart柱状图饼图
JfreeChart画出柱状图饼图的代码片段及详细的注释,附件为JfreeChart中文API一览表,和生成的柱状图,饼图图片 import java.awt.Font; import java.io.FileOutputStream; import java.io.IOException; import org.jfree.chart.C…...

自动装配的底层实现
public void autowire(Object o, Map<String, String> map) throws Exception { // 获得map 所有key Set<String> keys map.keySet(); // 获得Object中所有属性 // 获得Class对象 Class c o.getClass(); // 获得…...
每天一个adb命令:input 命令详解
input命令可以用于向键盘发送一些指令,先看看input的官方说明: Usage: input [<source>] <command> [<arg>...]The sources are:mousekeyboardjoysticktouchnavigationtouchpadtrackballstylusdpadtouchscreengamepadThe commands an…...

webservice学习记录笔记(一)
一、先理解什么是服务 现在的应用程序变得越来越复杂,甚至只靠单一的应用程序无法完成全部的工作。更别说只使用一种语言了。 写应用程序查询数据库时,并没有考虑过为什么可以将查询结果返回给上层的应用程序,甚至认为,这就是数…...

flex获得指定时间段一共多少天
/** * 获得某个时间段 共有多少天 * param start 开始时间 * param end 结束时间 * return * */ public static function getTimeDays( start:Date , end:Date , type:int0):Number { var _re:int 0 ; if(start && end) { var _str:Numbe…...

互联网产品与需求二 评估需求
需求分析之评估需求 一.KANO模型 五个用户需求类型1.必备型需求必备型需求是用户认为产品“必须有”的属性或者功能当其特性不充足(不满足用户需求)时,用户很不满意当其特性充足(满足用户需求)时,无所谓满意…...

flex勾选,自动刷新
mxml: <s:CheckBox label"刷新" buttonMode"true" id "frc" selected "{model.autoFresh}" change "{model.startAutoQuery(frc.selected)}"/> <s:Label text"间隔"/> &…...

flex 下拉框验证组件
//继承验证 public class ObjectNullValidator extends Validator { public function ObjectNullValidator() { super(); requiredFieldError "必须填写" ; } private var _invalidCode:String "222"; public static function validateS…...

flex 事件机制详解
事件机制的工作流程 1:关于事件流 当一个事件发生,必然存在一个派发事件的对象,这里称之为目标对象。 当事件发生后flashPlayer生成一个携带数据的对象,然后检查目标对象是否处于显示层中,如果是则遍历从根容器一直到目…...
Appium-java API详解
目前appium-java最新版本是5.0.0-BETA3,因此就拿最新的说明,以Java为例,首先引入java client的依赖:<dependency><groupId>io.appium</groupId><artifactId>java-client</artifactId><version&g…...
log4j学习demo
log4j简介 Log4j是Apache的一个开放源代码项目,是项目中比较常用的日志记录组件。 引入log4j <dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.14</version></dependency> log4…...

Appium学习遇到的坑
安装篇 Q1:安装时要求java运行环境为最低1.8,我原先的jdk1.7无法运行。 A1:升级jdk后解决。附appium安装教程 配置篇 Q2:运行提示error:Error: Android bootstrap socket crashed: Error: getaddrinfo ENOTFOUND lo…...

每天一个adb命令:pm 命令详解
介绍adb shell中一个很重要的命令——pm(Package Manager),这个命令主要用于获取和安装在 Android 设备上的应用信息。 关于pm命令的用法解析。命令行下输入adb shell pm即可获得关于pm的用法帮助,如下所示: usage: …...

到底什么是互联网思维
本文转字http://www.managershare.com/2014/04/28/internet-thinking-magic-power/课前秀:三个段子 第一个段子:有一个毫无餐饮行业经验的人,他开了一家餐馆,菜品只有12道,在北京只有两家分店;仅两个月时间…...

面向对象编程的弊端
英文原文:What’s Wrong with OOP and FP 我不理解为什么人们会对面向对象编程和函数式编程做无休无止的争论。就好象这类问题已经超越了人类智力极限,所以你可以几个世纪的这样讨论下去。经过这些年对编程语言的研究,我已经清楚的看到了问题…...
python数据类型
重温python数据类型,重点掌握str,list,tuple及dict类型。...

互联网产品与需求三 需求优先级定义
需求优先级定义即便是已经少选评估出来的需求,很多时候量也是非常大的,而哪些该做,哪些不该做,很多时候我们会遇到:Boss拍脑袋要这么做自己拍脑袋要这么做顾此失彼,左顾右盼其实,在产品不同阶段…...

Hibernate 主键生成策略
<generator>:主键生成策略 increment:递增,hibernate自动产生主键.max(id) ,采用带走1算法,多进程/集群环境下不推荐使用. identity:设置表主键是自增字段,映射文件采用该策略,依赖底层库, auto_increment identity 适用于MySQL、DB2、MS SQL Server,…...

每天一个adb命令:dumpsys命令详解
dumpsys是一个能帮助我们对手机进行性能分析的命令,它可以帮助我们获取电池、内存、cpu、磁盘、wifi等等信息,具体能查询的信息可以通过命令: adb shell dumpsys | grep DUMP OF SERVICE DUMP OF SERVICE DockObserver: DUMP OF SERVICE Sm…...

spring装配bean
最近在看《spring实战》一书,记录下spring装配bean这一章中自己学到的一些知识点。下面简单说明下bean和装配这两个概念的意思。 bean:在spring中代表组件,通过bean将不同的组件联系在一起。装配:是指创建应用对象之间协作关系的行…...

记一次爬虫实践(二):下载图片及打包
登录之后,我们开始下载图片。 这里把完整程序po一下。 程序中用到的框架是flask,参考Flask文档 # encodingUTF-8 import zipfileimport flask import requests import os import urllib2 import time from flask import Flask, jsonifyapp Flask(__n…...

javaSE之反射
什么是反射? 简单的说:剖析java类中的各个组成部分,映射成一个个java对象。 在java.lang.reflect中。 反射用在哪? 多用于框架和组件,利用反射技术写出复用性高的通用程序 我只列出了反射中几个常用的API 类 Class 构…...
ADB学习笔记
简介: ADB的全称为Android Debug Bridge(调试桥), 它是一个客户端-服务器端程序,其中客户端是你用来操作的电脑, 服务器端是android设备。作用显而易见,能方便我们在PC上对手机进行调试的一些工作。 原理…...
Appium简介
Appium简介 Appium is an open source, cross-platform test automation tool for native, hybrid and mobile web apps, tested on simulators (iOS), emulators (Android), and real devices (iOS, Android, Windows). 优缺点 优点显而易见,支持webview、hybri…...

JSON相关知识点
JSON是工作中经常会遇到的一种数据结构,下面来讲讲与他相关的一些知识点。 JSON简介: JSON: JavaScript Object Notation(JavaScript 对象表示法) JSON 是存储和交换文本信息的语法,类似 XML。 JSON 比 XML 更小、更快,更易解析。 JSONObj…...

产品之增删查改显算传
原文:http://qingsong.sinaapp.com/?p422 不知道大家在做产品设计时有时候会不会和我一样,一个很简单的功能却给忽略了,或者一个很常规的应用点视而不见,等提交技术开发后才发现少了一点给开发带来了很多困扰,于是不得…...

myeclipse的一些使用技巧
一直都是看别人的博客,学习别人的心得, 但是软件行业涉及的技术太多,学过的很多东西都忘了,今天我也弄个博客玩玩, 把我所学的,工作中遇到的问题也做做记录,方便自己,也方便他人&…...

java基础需要强化之关键
多线程 进程和线程的区别 ProccessBuilder 和 Runtime.getRuntime().exec java中两种线程的创建方式 extends Thread和 implements Runnable 线程的生命周期:线程创建、Runnable、Running、Blocked、dead sleep、yield、join 等方法 线程打断 interrupt 什么是守护线…...

MD5加密算法详解
注:MD5不是绝对的安全,有俩md5解决 /******************************************************************************* * keyBean 类实现了RSA Data Security, Inc.在提交给IETF 的RFC1321中的keyBean message-digest * 算法。 *****************…...

HTTP协议详解
HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的规范化工作…...

互联网产品与需求一 获取需求的方法
一、行业调研分析报告 1中国移动互联网用户调查数据2列举一些常用的行业数据分析艾瑞网:http://www.iresearch.cn/199IT数据(中文互联网数据咨询中心):http://www.199it.com/量子恒定(电商数据分析):http://www.lianezing.com/网站分析在中国:http://w…...

flex blaze+java通信的例子
步骤: 1:建立java web程序 2: 下载blazeDS包,解压后将WEB-INF下的 flex,lib,web.xml复制到java程序的WEB-INF下 3:打开web.xml文件将以下代码的注释去掉,并修改 <param-value>…...

flex验证座机,手机的框架
import mx.utils.StringUtil; import mx.validators.ValidationResult; import mx.validators.Validator; public class PhoneValidator extends Validator { public function PhoneValidator() { super(); } private var _phoneInvalid:String"正确格式(010-865…...

java的几种对象(PO,VO,DAO,BO,POJO)解释
一、PO:persistant object 持久对象,可以看成是与数据库中的表相映射的java对象。最简单的PO就是对应数据库中某个表中的一条记录,多个记录可以用PO的集合。PO中应该不包含任何对数据库的操作。 二、VO:value object值对象。通常用于业务层之间的数据传递࿰…...

Python高级特性
Python高级特性 切片迭代及迭代器列表生成式生成器 这些高级特性的作用都是一样的,为了代码的简洁、高效运行。 切片 切片让取一个list或tuple的部分元素变得相当简单, e.g: L[‘jack’,’mike’,’jerry’] 那么第一个位置,索引为0&a…...

产品战略与战术之行业分析
产品的战略和战术之行业分析1确定行业规模行业的规模大小某种程度上讲他决定了产品能够有多少的盈利价值和体量互联网是一个强者通吃的行业第一名很舒服第二名能混第三名就很悲催了这一点和传统行业区别相当大,所以在做行业规模预测的时候需要我们仔细评估行业里…...

每天一个adb命令:screen 命令详解
screen命令分为截屏screencap命令及录制视频screenrecord命令。 screencap命令: sage: screencap [-hp] [-d display-id] [FILENAME]-h: this message-p: save the file as a png.-d: specify the display id to capture, default 0. If FILENAME ends with .png …...

每天一个adb命令:monkey命令详解
国际惯例,先用adb shell monkey 看看具体用法。 具体用法 usage: monkey [-p ALLOWED_PACKAGE [-p ALLOWED_PACKAGE] ...][-c MAIN_CATEGORY [-c MAIN_CATEGORY] ...][--ignore-crashes] [--ignore-timeouts][--ignore-security-exceptions][--monitor-native-cra…...

spring boot入门学习
spring boot 入门基础前言什么是spring boot?为什么要用spring boot?spring boot的常用注释有哪些?Controller层RequestMapping详解配置相关自动配置一个简单的demo实践idea如何新建spring boot项目?前言 微服务这个概念最近比较…...

javaSE之类加载器
类加载器,说白了就是加载类的呵呵 .类加载器负责将.class文件(可能在磁盘上,也可能在网络上)加载到内存中,并为之生成对应的java.lang.Class对象 .当JVM启动时,会形成由三个类加载器组成的初始类加载器层次…...

flex 计算指定日期是本年度第几周
/** * 计算指定日期是本年度第几周 *传日年月日,返回number */ private function weekOfYear(yyyy:Number,mm:Number,dd:Number):Number{ var myDate:Date new Date(yyyy, mm - 1, dd); var startDate:Date new Date(yyyy,0,1); v…...

flex计算某一日期的周开始和结束日期
/** * 计算 某个日期所在周的开始日期和结束日期 * param value * param isZero 0 当前时间 , 1 日期时间设置为0 , * return Array[0] 周一的日期 Array[1] 周日的日期 * */ public static function getCurrentDayFE(value:Date, isZero:int1):Array…...