当前位置: 首页 > 编程日记 > 正文

TestNG学习随笔

转载自:http://blog.sina.com.cn/s/blog_68f262210102vh5c.html

通过本人实践,文中所讲的程序可以正确运行,作用正确,并且浅显易懂。以下就是我从中摘录的重要知识点,就当留作自己记录或者帮助其他想学TestNG的人一点借鉴吧!若其中有哪里不正确,请留言指出,谢谢!~另外,如若有侵权的地方,请联系本人,得到通知后立刻撤下,再次感谢!~

一、TestNG简介

这个网上一搜一大堆,这里就不细说了。官方定义:TestNG是一个测试框架,其灵感来自JUnit和NUnit,但引入了一些新的功能,使其功能更强大,使用更方便。

二、为什么使用TestNG

这个我觉得就没必要说了,大家既然能看到这篇博客,说明就已经打算使用TestNG了,总之就是优点多多 -_-

三、TestNG的配置

已经确定使用TestNG了,那现在就开始配置它吧。

首先,需要明确的是,我使用的是Eclipse

1.安装TestNG插件

在Eclipse中点击help-->install new software...

然后,点击add按钮,输入Name(内容随意填写)和Location(填写http://beust.com/eclipse),点击ok

选中加载出来的TestNG选项,然后一路Next

最后,来验证一下是否已经成功安装TestNG。大家可以新建一个工程,然后点击file-->new-->Other,看看里面有没有TestNG的选项,如果有,就说明已经成功安装了。

2.准备相关jar包(注意:版本号可以不一致,但是尽量使用最新的jar包)

四、编写测试用例

终于到了最期待的环节了。。。

1.新建一个java project,并且将上面下载的相关jar包附加到工程中

2.规范代码

<1>CommonFunction:里面用于存放所有的共用函数;方便之后所有的测试用例来调用,此包中的代码需要专人来维护,用作工具包

<2>TestCases:里面用于存放具体的测试用例;用于测试

<3>TestData:里面用于存放测试数据,里面的文件均为xml格式

<4>testng.xml:用于组织测试用例,以及进行相关设置

<5>lib:用于存放saxon-8.7.jar,后面会进行说明,此处可以忽略,后面会讲到

<6>build.xml:里面是为了对testNG测试报告进行二次加工,此处可以忽略,后面会讲到

3.创建TestNG文件

new-->Other-->TestNG,选择@BeforeTest、@AfterTest,并且在XML suite file:处填写testng.xml,点击finish

4.编写测试代码

写完后,右键HelloWorld.class文件,点击run as-->TestNG Test。

运行结果是:

这段代码主要是为了了解在程序运行过程中,@BeforeTest、@AfterTest这些方法先后的执行顺序,当然,除了这些Annotations,还有其他的,在这里,我们先介绍这两个,有兴趣的朋友可以在新建TestNG文件时,在Annotations里的方法全部选中,运行一遍,试试看效果如何。

我们通常吧变量定义或者是对测试用例的前置操作放到beforeTest()函数中,而对测试产生的数据清除或是关闭浏览器等操作放到afterTest()函数中。

以上编写的测试用例仅仅只是最简单的测试用例,如果我们想结合浏览器,实现自动打开浏览器,输入指定的网址,进行指定的操作,则就需要用到WebDriver,下面,我们继续对这个测试用例进行编辑。

我们把刚才f()方法里的System.out.println("Hello World!");语句注释掉,写下如下代码:

上边代码的意思是:打开火狐浏览器,输入百度网址,跳转到百度暂停5秒后关闭浏览器。

需要注意的是,如果仅仅输入上面的语句,是会报一个关于“geckodriver”的错误的,此时,我们需要在网上下载一个geckodriver.zip包,下载下来解压后,得到一个geckodriver.exe文件,在WebDriver driver = new FirefoxDriver();前面加入如下代码:

其中,第一句中方法的第二个参数写入的是你存放geckodriver.exe的目录位置,注释掉的语句则分别代码打开的浏览器不同(IE和Chrome),此时,再次运行程序,则不会看到报错信息了。

注意:如果你使用火狐浏览器,仍报错,则下载安装一个54.0版本的火狐浏览器,再重新试一下。

此时,我们已经完成了TestNG的最基本的使用!下面,我们将会再这个基础上,再深入一点继续学习!

五、TestNG进阶

在学习后面的内容之前,请先学习了解一下另外一篇文章里的内容:http://www.cnblogs.com/zhangfei/archive/2012/10/09/2717043.html

而我们则是通过读取TestData下的文件(HelloWorld.xml)来使用@DataProvider传递数据

1.首先,我们先在CommonFunction包中新建DataProvide.java文件,里面代码如下:

里面init方法的意思就是传入一个文件名,然后通过这个方法,把这个xml文件转化为一个dom文件,并返回给一个document对象。而providerMethod方法的意思则是为后面使用者提供数据,其中需要注意的是,方法前面必须使用@DataProvider注明,如果不写后面括号里的内容也可以,系统默认name值为方法名。method则代表调用providerMethod这个方法的当前方法。只要是被DataProvider标明的方法,都必须有一个Object[][]的返回值,而此处返回了一个Document对象。

2.其次,我们仍在CommonFunction包中新建另外一个java文件---DataReader.java,里面的代码如下:

其中,readnodevalue方法的作用就是根据传入的document对象、firsttag、secondtag,来得到最终指定节点里面的文本内容。

3.再次,在TestData中新建HelloWorld.xml文件,里面代码如下:

我们最终要得到的就是“Webdriver”这个内容。

4.最后,我们修改HelloWorld.java文件

这个文件中,需要注意的是,在f()方法前面,我们加上了@Test(dataProvider="Test_xml_dataprovider"),代表接收name为Test_xml_dataprovider的DataProvider提供过来的数据;在f()方法也变为了f(Document params);WebDriver相关的操作应该也都可以看懂吧?先在beforeTest函数中解析HelloWorld.xml文件,然后再打开了火狐浏览器,进入百度页面,根据ID先找到百度的输入框,然后点击这个输入框,调用readnodevalue方法,得到“WebDriver”这个文本,填写到输入框中,等待2秒后点击搜索,再等待5秒,检查搜索结果中是否有和搜索内容一致的文本,最后在afterTest函数中退出浏览器。

5.最最后,testng.xml的编写

常用的参数:

详细讲解,请参考:http://www.cnblogs.com/choosewang/articles/3079983.html,而各个参数的具体取值及结构,可以参考:http://testng.org/testng-1.0.dtd.php。

      默认Testng的样子

      

<1>Suite name 标识测试集的名字,这个名字会在测试报告中显示。

<2>Suite parallel 是否并行运行测试用例,这个在多线程中会用到,false 为不允许多线程。

<3>Test name 测试工程的名字,一个测试工程可以包含多个测试类,一个测试类中可以包含多个测试方法。

      <4>通常我们添加测试方法的办法是添加 classes 节点,当然也可以添加更多的测试工程和测试集。

      哪些测试方法需要执行和哪些测试方法不需要执行:

        

详细的Testng.xml节点,请参考:http://blog.csdn.net/five3/article/details/25907693

我们现在的Testng.xml代码如下:

当然,需要在TestCases包下再新建几个java文件(HelloTom,HelloJim,HelloCate),里面的方法可以参考如下代码:

至此,我们可以右击testng.xml-->run as-->run configurations,在Test标签里选择Suite,并且选中自己新建的Testng.xml文件,点击run,即可开始测试。

运行的测试报告在测试代码的根目录下生成一个test-output,里面有一个index.html,可以查看,但是很不美观,不利于查看,所以我们需要利用第三方 TestNG-xslt优化一下测试报告。

<1>下载TestNG-xslt并把其中的saxon-8.7.jar复制到测试项目lib下(此处就是文章开头介绍目录时提到的lib目录),并附加到工程中

      <2>从你下载的包中拷贝文件 testng-results.xsl 到 test-output 目录下。testng-results.xsl 文件的位置是testng-xslt-1.1.1/src/main/resources

      <3>新建build.xml文件(文章开头提到的),里面代码如下:

        

<4>右击build.xml,点击run as-->External Tools Configurations,在Targets标签里勾选transfo...,点击run

此时,再次点击test-output下的index.html,就会看到美观的报告啦!!!

5.此时,最终效果达成了!~

转载于:https://www.cnblogs.com/FruitBoy/p/8480423.html

相关文章:

录制短视频的录制按钮边框计时效果

项目增加录制短视频功能, 需一录制功能按钮, 使用贝塞尔曲线结合shapelayer绘制按钮边框的计时功能 代码如下: #import "YGRecordView.h" #define BeforeRecord_LineWidth 2.0#define BeforeRecord_LineColor UIColorFromRGBA(0xffffff, 1)#define Record_LineWidt…

区块链学堂:区块链引子

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自链客区块链技术问答社区&#xff0c;未经允许拒绝转载。 区块链学堂&#xff08;1&#xff09;&#xff1a;区块链引子 相信正在看这篇文章的读者一定已经听说过区块链了&#xff0c;并且也相信…

Git命令文本手册

git init # 初始化本地git仓库&#xff08;创建新仓库&#xff09; git config --global user.name "xxx" # 配置用户名 git config --global user.email "xxxxxx.com" …

Mininet的介绍安装

Mininet的介绍 Mininet是一个强大的网络仿真平台&#xff0c;通过这个这个平台&#xff0c;我们可以很方便的模拟真实环境中的网络操作与架构。当前SDN/OpenFlow发展的如火如荼&#xff0c;但是在真实网络中又不可以进行相关的网络实验&#xff0c;自然需要一个仿真平台可以对这…

项目的简单总结一 -- 关于对贝塞尔和shapelayer结合使用的动画特效

现项目基本稳定, 要开始新的项目, 总结一二 关于对贝塞尔和shapelayer结合使用的动画特效, 在这次的项目中有几处使用到 故做了个小的demo, 记录下 效果如下: demo地址:https://github.com/wyon0313/BezierAnimation

内部区块链的优缺点

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自链客区块链技术问答社区&#xff0c;未经允许拒绝转载。 内部区块链的优缺点1 区块链的作用是取代可信赖的第三方&#xff0c;或者是在不完全相互信任的实体之间建立信任关系&#xff0c;如此看来…

Spring框架系列之AOP思想

微信公众号&#xff1a;compassblog 欢迎关注、转发&#xff0c;互相学习&#xff0c;共同进步&#xff01; 有任何问题&#xff0c;请后台留言联系&#xff01; 1、AOP概述 &#xff08;1&#xff09;、什么是 AOP AOP 为 Aspect Oriented Programming 的缩写&#xff0c;意为…

jstack 使用(转)

dump 文件里&#xff0c;值得关注的线程状态有&#xff1a;死锁&#xff0c;Deadlock&#xff08;重点关注&#xff09; 执行中&#xff0c;Runnable 等待资源&#xff0c;Waiting on condition&#xff08;重点关注&#xff09; 等待获取监视器&#xff0c;Waiting on monit…

ios TableView编辑状态多选框的修改

在- (void)layoutSubview 和 - (void)setEditing:(BOOL)editing animated:(BOOL)animated 中添加 UIImage *selectImg [UIImage imageNamed:"im_select_sign"]; UIImage *disSelectImg [UIImage imageNamed:"im_disSelect_sign"]; for (UIC…

区块链有哪些技术特征

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自链客区块链技术问答社区&#xff0c;未经允许拒绝转载。 区块链有哪些技术特征 在信息网络化的大背景下&#xff0c;当需要与不熟悉的对手方进行价值交换活动时&#xff0c;人们如何做才能防止不会…

《JavaEE开发的颠覆者——Spring Boot实战》是一本好书

这本书的风格非常好、每一节都是先点明这一块知识的要点&#xff0c;随后就手把手的做出一个最简明、但有能体现核心的实例&#xff08;大多只有几个Class&#xff09; 这样的书用来熟悉一门框架&#xff0c;实在是再好不过。转载于:https://www.cnblogs.com/nanlan2017/p/1045…

html css 布局知识概况

1、如果想设置页面居中&#xff0c;当设置margin属性为auto的时候&#xff0c;不能在设置浮动或绝对定位属性。并且一定要设置width为一个定值 2、盒子模型三维立体结构图 3、浮动布局 利用浮动可以实现横向布局&#xff0c;通过float来实现&#xff08;left--左浮动&#xff0…

项目的简单总结二--可拉伸的头视图

项目总结二 tableVIew和collectionview中头视图的可拉伸放大效果 demo中只做了tableview的效果, collectionview做法一样 效果如下图: demo地址: https://github.com/wyon0313/ZoomHeaderView

浅谈区块链技术

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自链客区块链技术问答社区&#xff0c;未经允许拒绝转载。 浅谈区块链技术 这几天空闲的时候在网上浏览了一些区块链的技术&#xff0c;其实区块链只是一个技术&#xff0c;只不过是比特币很好的实…

IIS 7.5 去掉index.php 西数服务器

//新建web.config 加上下面代码<?xml version"1.0"?> <configuration> <system.webServer><rewrite><rules><rule name"OrgPage" stopProcessing"true"><match url"^(.*)$" /><condit…

bzoj1927: [Sdoi2010]星际竞速

跟上一题几乎一样。。。 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<queue> using namespace std; #define rep(i,n) for(int i1;i<n;i) #define clr(x,c) memset(x,c,sizeof(x)) #define op() cl…

在cell中取得UITableView所在的ViewController对象

原来碰到这个问题一般会将控制器传进cell中, 或者将cell要做的响应事件回调到控制器去处理, 前段时间找到一种方法觉得很不错 - (UIViewController *)getTableViewSuperViewController { for (UIView* next [self superview]; next; next next.superview) { UI…

区块链当前现状

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自链客区块链技术问答社区&#xff0c;未经允许拒绝转载。 区块链是分布式账本技术&#xff0c;用于记录交易数据&#xff0c;具有不可篡改性、完整分布性、可追溯性等技术优势&#xff0c;应用包括…

MVC 4.0 Razor模板引擎 @Html.RenderPartial 与 @Html.RenderAction 区别

近来在学习MVC 4.0&#xff0c;设置布局全局网页的页脚&#xff0c;使用了Razor语法 {Html.RenderPartial("Footer", Model.FooterData);} 但是并不理解Html帮助器方法Html.RenderPartial。 先来介绍一下Html.RenderPartial用法。 Html.RenderPartial在Asp.net Mvc中…

iOS 图片处理-利用GPUImage 磨皮和美白图片

项目中要求处理图片, 简单记录一下美白和磨皮过程 (其中GPUImage还有美颜滤镜, 使用方式基本一样) //磨皮 - (void)editPhotoByBilateralWithLevel:(CGFloat)level { GPUImagePicture *pic [[GPUImagePicture alloc] initWithImage:image]; // 磨皮滤镜…

linux下编译php扩展

1 在pecl.php.net搜索你需要的php扩展 2 在解压后的扩展目录运行phpize 3 执行编译./configure --with-php-config/usr/local/php/bin/php-config 4 修改php/lib/php.ini文件 加上这句话extention扩展.so的绝对路径转载于:https://www.cnblogs.com/wyqn/p/8493456.html

区块链技术原理

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自链客区块链技术问答社区&#xff0c;未经允许拒绝转载。 以比特币的区块链为例&#xff0c;你可以把区块链想象成一个比特币的公共账本&#xff0c;这个账本&#xff1a; 1.存放在互联网的各个比…

Spring之事务管理配置

1. 基于注解的事务配置 1. 在需要添加事务的方法上加上Transactional注解2. Spring的配置文件中配置事务管理器1 <!-- 添加事务管理器组件DataSourceTransactionManager -->2 <bean id"transactionManager"3 class"org.springframewor…

iOS 图片处理-图片旋转和裁剪

项目中要求处理图片, 简单记录一下图片旋转和裁剪过程 /** 将图片旋转弧度radians */- (UIImage *)imageRotatedByRadians:(CGFloat)radians{ // calculate the size of the rotated views containing box for our drawing space UIView *rotatedViewBox [[UIView alloc…

ThinkPHP 3.1.2 视图 1

一、模板的使用 &#xff08;重点&#xff09;a、规则模板文件夹下[TPL]/[分组文件夹/][模板主题文件夹/]和模块名同名的文件夹[Index]/和方法名同名的文件[index].html&#xff08;.tpl&#xff09;更换模板文件的后缀名&#xff08;修改配置文件&#xff09;TMPL_TEMP…

mysql事务处理用法与实例详解

MySQL的事务支持不是绑定在MySQL服务器本身&#xff0c;而是与存储引擎相关1.MyISAM&#xff1a;不支持事务&#xff0c;用于只读程序提高性能 2.InnoDB&#xff1a;支持ACID事务、行级锁、并发 3.Berkeley DB&#xff1a;支持事务一个事务是一个连续的一组数据库操作&#xff…

C++ 类的内存分布

C类内存分布 转自&#xff1a;http://www.cnblogs.com/jerry19880126/p/3616999.html先写下总结&#xff0c;通过总结下面的例子&#xff0c;你就会明白总结了。下面总结一下&#xff1a; 1、虚基类指针和虚函数指针是可以继承的 2. 虚函数指针来源于父类或者自己是第一个声明虚…

iOS 关于手机权限的检查与获取

手机通讯录权限: /** * 检测权限并作响应的操作 */ - (void)checkAuthorizationStatus:(UISwitch *)sender { switch (ABAddressBookGetAuthorizationStatus()) { case kABAuthorizationStatusAuthorized: //存在权限 //获取通讯…

也谈谈区块链技术

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链社区&#xff0c;未经允许拒绝转载。 现在区块链技术很火&#xff0c;而且几乎被上升到了一个“革命性”的高度&#xff0c;很多股票居然都因为沾了点区块链变得炙手可热。其实这玩意没有这么…

nyoj——297(期望)

GoroSort 时间限制&#xff1a;3000 ms | 内存限制&#xff1a;65535 KB难度&#xff1a;4描述Goro has 4 arms. Goro is very strong. You dont mess with Goro. Goro needs to sort an array of N different integers. Algorithms are not Goros strength; strength is Gor…