本文档由Felipe Knorr Kuhn撰写,并根据其博客上发布的一系列文章进行改编

建模您的测试用例

在编写测试用例之前,您需要知道如何验证以及将要验证的内容。让我们使用WordPress “创建新帖子”测试用例

  1. 请访问http://demo.opensourcecms.com/wordpress/wp-login.php
  2. 在“用户名”字段中输入“admin”
  3. 在“密码”字段中输入“demo123”
  4. 单击“登录”按钮
  5. 验证文本“Howdy,admin”是否存在
  6. 单击“帖子”链接
  7. 单击“添加新”按钮
  8. 在标题字段中输入“Selenium Demo Post”
  9. 单击“发布”按钮
  10. 验证是否存在“发布后”文本

考虑到这种情况,首先想到的是创建一个遍历所有步骤的长测试用例。如果您正在编写手动测试用例,这可能是一个很好的方法。但是,由于我们正在编写自动化测试,因此我们希望尽可能将脚本编写为模块化,以便在将来的场景中重用其中的部分内容。

这就是我打破测试的方式:

  1. 启动WordPress网站
  2. 打开“管理员登录”页面
  3. 输入有效的登录数据
  4. 导航到“写信息”页面
  5. 写这篇文章
  6. 发布帖子
  7. 确认它实际上是发布的

请记住,这只是一个例子。只要具有业务价值并验证业务逻辑,您就可以以任何您想要的方式为测试建模。

让我们看看如何使用实际的Java代码:

@Test(description="Launches the WordPress site")
public void launchSite(){
  selenium.open("");
  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");
  //TODO:Assert
}
  
@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")
public void logout() {
  selenium.click("//a[text()='Log Out']");
  //TODO:Assert
}

这些是我们将要使用的测试方法(或步骤)。

配置方法

如果您熟悉单元测试框架,则可能了解设置和拆卸方法。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));
  
  try {
    server = new SeleniumServer(false, rcc);
    server.boot();
  catch (Exception e) {
    throw new IllegalStateException("Can't start selenium server", e);
  }
  
  proc = new HttpCommandProcessor(seleniumHost, Integer.parseInt(seleniumPort),
      seleniumBrowser, seleniumUrl);
  selenium = new DefaultSelenium(proc);
  selenium.start();
}
  
@AfterSuite(alwaysRun = true)
public void setupAfterSuite() {
  selenium.stop();
  server.stop();
}

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" />
  <parameter name="selenium.url" value="http://demo.opensourcecms.com/wordpress/" />
 
  <test name="Write new post" preserve-order="true">
    <classes>
      <class name="test.Wordpress">
        <methods>
          <include name="launchSite" />
          <include name="openAdminPage" />
          <include name="loginAsAdmin" />
          <include name="navigateNewPost" />
          <include name="writeBlogPost" />
          <include name="publishBlogPost" />
          <include name="verifyBlogPost" />
        </methods>
      </class>
    </classes>
  </test>
</suite>

在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 {
@Test
public void test1(){
  selenium.open("");
  //...
}
 
@Test
public void test2(){
  selenium.open("");
  //...
}
}

这比将配置方法保留在测试类中要好。

Selenium和TestNG的更多相关文章

  1. IDEA+Java:Selenium+Maven+TestNG基本WebUI自动化测试环境搭建

    IDEA+java:Selenium+Maven+TestNG 本文介绍的测试环境,应该是最基本的测试环境了,也是很多文章都有写,这里做一个完整的图文配置整理,方便阅读理解! 使用maven的好处,由 ...

  2. selenium webdriver testng自动化测试数据驱动

    selenium webdriver testng自动化测试数据驱动 selenium webdriver testng自动化测试数据驱动 一.数据驱动测试概念 数据驱动测试是相同的测试脚本使用不同的 ...

  3. maven+selenium+java+testng+jenkins自动化测试

    最近在公司搭建了一套基于maven+selenium+java+testng+jenkins的自动化测试框架,免得以后重写记录下 工程目录 pom.xml <project xmlns=&quo ...

  4. 自动化测试框架selenium+java+TestNG——配置篇

    最近来总结下自动化测试 selenium的一些常用框架测试搭配,由简入繁,最简单的就是selenium+java+TestNG了,因为我用的是java,就只是总结下java了. TestNG在线安装: ...

  5. selenium第一课(selenium+java+testNG+maven)

    selenium介绍和环境搭建 一.简单介绍 1.selenium:Selenium是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包 ...

  6. Selenium+Java+TestNG环境配置

    1. JDK 2.eclipse+TestNG >TestNG安装.   Name:testng  Location:http://beust.com/eclipse.如图: 3.seleniu ...

  7. Selenium WebDriver TestNg Maven Eclipse java 简单实例

    环境准备 前提条件Eclipse 已经安装过 TestNg ,Maven 插件 新建一个普通的java项目 点击右键 configure->convert to Maven Project 之后 ...

  8. selenium 利用testNG对异常进行自动截图

    哈哈哈,很久没写博客了,懒了. 因为一些原因最近需要把监听事件重新整理一下,开始没细想,直接copy网上的,其实结果发现报错很多,或者是达不到效果,然后把之前的代码翻出来,仔细看了一下.下面给一些需要 ...

  9. jenkins、ant、selenium、testng搭建自动化测试框架

    如果在你的理解中自动化测试就是在eclipse里面讲webdriver的包引入,然后写一些测试脚本,这就是你所说的自动化测试,其实这个还不能算是真正的自动化测试,你见过每次需要运行的时候还需要打开ec ...

  10. JAVA+SELENIUM+MAVEN+TESTNG框架(二)新建项目

    1.新建maven项目 2.下载selenium的jar包,放入maven依赖库中 3.新增testng依赖库,build path->add libirary->testng 4.查看自 ...

随机推荐

  1. DELL MD3200i存储控制器解锁方法

    DELL MD3200i存储控制器解锁方法 现有一台DELL MD3200i存储,因种种原因导致控制器被锁定,这里是刚出厂的一台存储,出现这个问题让我们都很困惑,只能怀疑DELL公司的问题. 这台存储 ...

  2. python-ldap修改AD域用户密码(CA+SSL)

    代码连接:https://github.com/raykuan/ldap-notes 使用python的ldap模块连接AD服务器,有两种方式: 非加密:con = ldap.initialize(' ...

  3. orcl创建表及管理表

    常用的字段数据类型: .字符串(varchar2(n)) n表示保存最大长度,基本200作用..整数(number(n)) n位的整数,也可用int代替.小数(number(n,m)) m为小数位,n ...

  4. [LOJ 6029]「雅礼集训 2017 Day1」市场

    [LOJ 6029] 「雅礼集训 2017 Day1」市场 题意 给定一个长度为 \(n\) 的数列(从 \(0\) 开始标号), 要求执行 \(q\) 次操作, 每次操作为如下四种操作之一: 1 l ...

  5. CGJ02、BD09、西安80、北京54、CGCS2000常用坐标系详解

    一.万能地图下载器中的常用坐标系 水经注万能地图下载器中的常用的坐标系主要包括WGS84经纬度投影.WGS84 Web 墨卡托投影.WGS84 UTM 投影.北京54高斯投影.西安80高斯投影.CGC ...

  6. poi 创建excel数据

    public static void main(String[] args) throws Exception { // TODO 设置excel的标题 List<String> exce ...

  7. uwsgi+django 配置

    uwsgi+django 创建新的虚拟环境,且解决crm的环境依赖 在虚拟环境下安装uwsgi pip3 install uwsgi 学习uwsgi命令,如何启动python应用 启动python w ...

  8. linux 的常用命令---------第九阶段

    Centos 7 系统启动及相关配置文件(面试题) 1. BIOS 初始化,开始post开机自检(主要检查磁盘.cpu.内存) 2. 加载 MBR 到内存 3. GRUB 阶段(可不说) 4. 加载内 ...

  9. Ubuntu16.04安装Zabbix3.2(快速安装教程)

    ubuntu16.04下zabbix安装和配置 上面这篇虽然是一样的,但是针对的版本有差异,版本差异,安装方式也就有差异,对要求的环境可能有所不同. 今天帮同事安装zabbix,按照如下几个步骤,就完 ...

  10. Docker学习要点记录

    Docker的架构和底层技术: 1.docker提供了一个开发,打包,运行app的平台2.把APP和底层infrastructure隔离开来 docker底层技术支持: 1>Namespaces ...