本文档由Felipe Knorr Kuhn撰写,并根据其博客上发布的一系列文章进行改编。
建模您的测试用例
在编写测试用例之前,您需要知道如何验证以及将要验证的内容。让我们使用WordPress “创建新帖子”测试用例。
- 请访问http://demo.opensourcecms.com/wordpress/wp-login.php
- 在“用户名”字段中输入“admin”
- 在“密码”字段中输入“demo123”
- 单击“登录”按钮
- 验证文本“Howdy,admin”是否存在
- 单击“帖子”链接
- 单击“添加新”按钮
- 在标题字段中输入“Selenium Demo Post”
- 单击“发布”按钮
- 验证是否存在“发布后”文本
考虑到这种情况,首先想到的是创建一个遍历所有步骤的长测试用例。如果您正在编写手动测试用例,这可能是一个很好的方法。但是,由于我们正在编写自动化测试,因此我们希望尽可能将脚本编写为模块化,以便在将来的场景中重用其中的部分内容。
这就是我打破测试的方式:
- 启动WordPress网站
- 打开“管理员登录”页面
- 输入有效的登录数据
- 导航到“写信息”页面
- 写这篇文章
- 发布帖子
- 确认它实际上是发布的
请记住,这只是一个例子。只要具有业务价值并验证业务逻辑,您就可以以任何您想要的方式为测试建模。
让我们看看如何使用实际的Java代码:
@Test(description="Launches the WordPress site") |
public void launchSite(){ |
selenium.waitForPageToLoad("30000"); |
assertEquals(selenium.getTitle(), "Demo | Just another WordPress site"); |
@Test(description="Navigates to the admin page") |
public void openAdminPage() { |
selenium.open("wp-admin"); |
selenium.waitForPageToLoad("30000"); |
assertEquals(selenium.getTitle(), "Demo 鈥� Log In"); |
@Test(description="Enters valid login data") |
public void loginAsAdmin() { |
selenium.type("user_login", "admin"); |
selenium.type("user_pass", "demo123"); |
selenium.click("wp-submit"); |
selenium.waitForPageToLoad("30000"); |
assertTrue(selenium.isTextPresent("Howdy, admin")); |
@Test(description="Navigates to the New Post screen") |
public void navigateNewPost() { |
selenium.click("//a[contains(text(),'Posts')]/following::a[contains(text(),'Add New')][1]"); |
selenium.waitForPageToLoad("30000"); |
assertTrue(selenium.isTextPresent("Add New Post")); |
@Test(description="Writes the new post") |
public void writeBlogPost() { |
selenium.type("title", "New Blog Post"); |
selenium.click("edButtonHTML"); |
selenium.type("content", "This is a new post"); |
@Test(description="Publishes the post") |
public void publishBlogPost() { |
selenium.click("submitdiv"); |
selenium.click("publish"); |
selenium.waitForPageToLoad("30000"); |
assertTrue(selenium.isTextPresent("Post published.")); |
@Test(description="Verifies the post") |
public void verifyBlogPost() { |
selenium.click("//a[contains(text(),'Posts') and contains(@class,'wp-first-item')]"); |
selenium.waitForPageToLoad("30000"); |
assertTrue(selenium.isElementPresent("//a[text()='New Blog Post']")); |
@Test(description="Logs out") |
selenium.click("//a[text()='Log Out']"); |
这些是我们将要使用的测试方法(或步骤)。
配置方法
如果您熟悉单元测试框架,则可能了解设置和拆卸方法。TestNG超越了这个想法,允许您定义将在测试套件,测试组或测试方法之后或之前运行的方法。这对我们的Selenium测试非常有用,因为您可以在开始运行测试套件之前创建Selenium服务器和浏览器实例。)
为此,我们将使用两个TestNG 注释:@BeforeSuite和@AfterSuite:
@BeforeSuite(alwaysRun = true) |
public void setupBeforeSuite(ITestContext context) { |
String seleniumHost = context.getCurrentXmlTest().getParameter("selenium.host"); |
String seleniumPort = context.getCurrentXmlTest().getParameter("selenium.port"); |
String seleniumBrowser = context.getCurrentXmlTest().getParameter("selenium.browser"); |
String seleniumUrl = context.getCurrentXmlTest().getParameter("selenium.url"); |
RemoteControlConfiguration rcc = new RemoteControlConfiguration(); |
rcc.setSingleWindow(true); |
rcc.setPort(Integer.parseInt(seleniumPort)); |
server = new SeleniumServer(false, rcc); |
throw new IllegalStateException("Can't start selenium server", e); |
proc = new HttpCommandProcessor(seleniumHost, Integer.parseInt(seleniumPort), |
seleniumBrowser, seleniumUrl); |
selenium = new DefaultSelenium(proc); |
@AfterSuite(alwaysRun = true) |
public void setupAfterSuite() { |
PS:你有没有注意到那些奇怪的参数?它们存储在XML文件中(我们将在下一节中看到)并由注入的ITestContext对象访问。
通过添加这些注释,TestNG引擎将在测试套件之前/之后自动调用配置方法(确保测试方法使用@Test注释),启动Selenium服务器并仅实例化Selenium客户端对象一次,重用相同的浏览器跨测试的会话。
创建XML文件
要定义测试的顺序,我们必须创建一个XML文件,列出我们想要运行的测试方法。确保测试方法使用@Test注释,否则TestNG引擎不会调用它们。
在TestNG 5.13.1之前,如果要按XML文件中定义的顺序运行测试,则必须使用方法拦截器。我已经在我的Github帐户上发布了我的方法拦截器的实现。从TestNG 5.13.1+开始,您只需将preserve-order参数添加到测试标记中,并包含您想要运行的方法,从而减少测试套件中不必要的代码。
这是XML文件:
<suite name="Knorrium.info - Wordpress Demo" verbose="10"> |
<parameter name="selenium.host" value="localhost" /> |
<parameter name="selenium.port" value="3737" /> |
<parameter name="selenium.browser" value="*firefox" /> |
<test name="Write new post" preserve-order="true"> |
<class name="test.Wordpress"> |
<include name="launchSite" /> |
<include name="openAdminPage" /> |
<include name="loginAsAdmin" /> |
<include name="navigateNewPost" /> |
<include name="writeBlogPost" /> |
<include name="publishBlogPost" /> |
<include name="verifyBlogPost" /> |
在Eclipse中启动测试
我们完成了测试,现在我们如何运行它们?
您可以使用Eclipse插件甚至以编程方式从命令行启动TestNG。我们将使用Eclipse插件。按照此处的官方TestNG文档中描述的步骤进行操作
如果您正确安装了TestNG,当您右键单击XML文件时,您将看到此菜单:

单击“作为TestNG Suite运行”,您的测试将开始运行。然后,您将看到这个漂亮的结果树:

思考未来
如果您真的想要考虑测试套件的未来,我建议您阅读AdamGoucher 在PragPub上发表的文章。他谈到了Selenium 2和Page Objects Model(一种非常好的模型测试方法,特别是如果你使用Selenium 2)。
由于有很多人仍在使用Selenium 1,我会坚持一段时间,但Selenium 2最终会在这里介绍。
随着测试套件中测试数量的增加,您会发现将它们分组到不同的测试类中是个好主意。如果这样做,您可以利用面向对象的编程并创建一个名为BaseTest的新类(例如),并将配置逻辑留在那里。这样,每个测试类都必须扩展BaseTest类并使用静态属性。
public class WordPressAdmin extends BaseTest { |
这比将配置方法保留在测试类中要好。
- IDEA+Java:Selenium+Maven+TestNG基本WebUI自动化测试环境搭建
IDEA+java:Selenium+Maven+TestNG 本文介绍的测试环境,应该是最基本的测试环境了,也是很多文章都有写,这里做一个完整的图文配置整理,方便阅读理解! 使用maven的好处,由 ...
- selenium webdriver testng自动化测试数据驱动
selenium webdriver testng自动化测试数据驱动 selenium webdriver testng自动化测试数据驱动 一.数据驱动测试概念 数据驱动测试是相同的测试脚本使用不同的 ...
- maven+selenium+java+testng+jenkins自动化测试
最近在公司搭建了一套基于maven+selenium+java+testng+jenkins的自动化测试框架,免得以后重写记录下 工程目录 pom.xml <project xmlns=&quo ...
- 自动化测试框架selenium+java+TestNG——配置篇
最近来总结下自动化测试 selenium的一些常用框架测试搭配,由简入繁,最简单的就是selenium+java+TestNG了,因为我用的是java,就只是总结下java了. TestNG在线安装: ...
- selenium第一课(selenium+java+testNG+maven)
selenium介绍和环境搭建 一.简单介绍 1.selenium:Selenium是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包 ...
- Selenium+Java+TestNG环境配置
1. JDK 2.eclipse+TestNG >TestNG安装. Name:testng Location:http://beust.com/eclipse.如图: 3.seleniu ...
- Selenium WebDriver TestNg Maven Eclipse java 简单实例
环境准备 前提条件Eclipse 已经安装过 TestNg ,Maven 插件 新建一个普通的java项目 点击右键 configure->convert to Maven Project 之后 ...
- selenium 利用testNG对异常进行自动截图
哈哈哈,很久没写博客了,懒了. 因为一些原因最近需要把监听事件重新整理一下,开始没细想,直接copy网上的,其实结果发现报错很多,或者是达不到效果,然后把之前的代码翻出来,仔细看了一下.下面给一些需要 ...
- jenkins、ant、selenium、testng搭建自动化测试框架
如果在你的理解中自动化测试就是在eclipse里面讲webdriver的包引入,然后写一些测试脚本,这就是你所说的自动化测试,其实这个还不能算是真正的自动化测试,你见过每次需要运行的时候还需要打开ec ...
- JAVA+SELENIUM+MAVEN+TESTNG框架(二)新建项目
1.新建maven项目 2.下载selenium的jar包,放入maven依赖库中 3.新增testng依赖库,build path->add libirary->testng 4.查看自 ...
随机推荐
- android打开存储卡(TF卡\SD卡)中的sqlite文件
android的SDK直接支持sqlite3的API. 打开SD卡上面的sqlite数据库,不需要SQLiteOpenHelper的继承类.只需要,SQLiteDatabase中的一些静态方法.如 ...
- 使用yum下载rpm包
查看系统有哪些可用的yum源yum repolist all yum指定本地源安装rpm包yum install <package-name> --enablerepo=<repos ...
- 【概率论】条件概率 & 全概率公式 & 朴素贝叶斯公式
0. 说明 条件概率 & 全概率公式 & 朴素贝叶斯公式 学习笔记 参考 scikit-learn机器学习(五)--条件概率,全概率和贝叶斯定理及python实现 1. 条件概率 [定 ...
- 用JS制作《飞机大作战》游戏_第1讲(素材查找和界面框架搭建)-陈远波
一.查找素材: 二.分析游戏界面框架: 登录界面.游戏界面.暂停游戏界面.玩家死亡后弹出界面:并对应的界面包含什么元素: 三.分别搭建以上四个界面: 1.登录界面与游戏界面框架(隐藏游戏界面,四个界面 ...
- 安装和配置Apache服务器(上)
首先,安装软件分安装版和压缩版,压缩版也就是我们现在所说的绿色安装包.安装板和压缩版的区别就是,安装板在安装的时候就已经自动给你配置好环境,压缩版安装之后还要自己配置环境.自己配置环境也是有好处的,知 ...
- Geometric Search
几何搜索 平衡搜索树(BST)在几何方面的应用,处理的内容变成几何对象,像点,矩形. 1d range search 先来看一维的情况,一维的范围搜索是后面的基础,处理的对象是在一条线上的点.这是符号 ...
- Alpha冲刺报告(8/12)(麻瓜制造者)
今日已完成 邓弘立: 完成了对主页UI控件的更新 符天愉: 没有完成留言模块,只是完成了留言的查询并且将留言多级回复格式化,同时和队友一起部署了商品发布的接口 江郑: 经过了这几天的编码,需求方面的数 ...
- 一篇关于介绍php的几个user 认证相关的几个包
http://kodeinfo.com/post/laravel-authentication-packages LARAVEL AUTHENTICATION PACKAGES By Imran Iq ...
- 【洛谷P3410】拍照题解(最大权闭合子图总结)
题目描述 小B有n个下属,现小B要带着一些下属让别人拍照. 有m个人,每个人都愿意付给小B一定钱让n个人中的一些人进行合影.如果这一些人没带齐那么就不能拍照,小B也不会得到钱. 注意:带下属不是白带的 ...
- 【转】PHP中file_put_contents追加和换行
在PHP的一些应用中需要写日志或者记录一些信息,这样的话. 可以使用fopen(),fwrite()以及 fclose()这些进行操作. 也可以简单的使用file_get_contents()和fil ...