TestNG-官网文档-之selenium

安装:

Eclipse:Help -> Software Updates -> Find and Install -> Search for new features to install

New Remote Site

Name:TestNG

URL: http://beust.com/eclipse

目录

1.如何利用参数使用TestNG的配置方法

2.怎么配置你的测试

3.为TestNG创建XML文件

4.使用Eclipse开始你的测试

5.如何让未来的测试设计更好

/**开始**/

建立你的测试用例

在写测试用例之前,你需要知道如何验证,或者什么将被验证。让我们用wordpress 的“create new post”写一个测试用例。

1.打开网页 http://demo.opensourcecms.com/wordpress/wp-login.php

2.在用户名处输入‘admin’

3.在密码处输入demo123

4.点击“log In”按钮

5.确认文字“Howdy,admin”存在

6.点击“Posts”链接

7.点击“Add New”按钮

8.在标题区域输入“Selenium Demo Post”

9.点击“Publish”按钮

10.确认文字“Post published”存在

考虑这个情景,想到的第一件事情是按照步骤创建一个很长的测试用例,对于手动测试,这可能是一个不错的测试用例,然而,由于我们写的是自动化用例,我们想要我们的脚本竟可能在未来的情景中可以重用。

以下是我如何分解这个测试:

1.打开workpress的站点

2.打开admin登陆页

3.输入登陆数据

4.引导去写post页面

5.写一个post

6.发布这个post

7.确认发布成功

记住这只是一个例子,你可以设计任何你想要的测试,只要他们又自身的商业价值并证明你的价值

让我们来看看Java代码如何实现:

 1 @Test(description="Launches the WordPress site")
 2 public void launchSite(){
 3   selenium.open("");
 4   selenium.waitForPageToLoad("30000");
 5   assertEquals(selenium.getTitle(), "Demo | Just another WordPress site");
 6 }
 7
 8 @Test(description="Navigates to the admin page")
 9   public void openAdminPage() {
10   selenium.open("wp-admin");
11   selenium.waitForPageToLoad("30000");
12   assertEquals(selenium.getTitle(), "Demo 鈥? Log In");
13 }
14
15 @Test(description="Enters valid login data")
16   public void loginAsAdmin() {
17   selenium.type("user_login", "admin");
18   selenium.type("user_pass", "demo123");
19   selenium.click("wp-submit");
20   selenium.waitForPageToLoad("30000");
21   assertTrue(selenium.isTextPresent("Howdy, admin"));
22 }
23
24 @Test(description="Navigates to the New Post screen")
25 public void navigateNewPost() {
26   selenium.click("//a[contains(text(),‘Posts‘)]/following::a[contains(text(),‘Add New‘)][1]");
27   selenium.waitForPageToLoad("30000");
28   assertTrue(selenium.isTextPresent("Add New Post"));
29 }
30
31 @Test(description="Writes the new post")
32 public void writeBlogPost() {
33   selenium.type("title", "New Blog Post");
34   selenium.click("edButtonHTML");
35   selenium.type("content", "This is a new post");
36   //TODO:Assert
37 }
38
39 @Test(description="Publishes the post")
40 public void publishBlogPost() {
41   selenium.click("submitdiv");
42   selenium.click("publish");
43   selenium.waitForPageToLoad("30000");
44   assertTrue(selenium.isTextPresent("Post published."));
45 }
46
47 @Test(description="Verifies the post")
48 public void verifyBlogPost() {
49   selenium.click("//a[contains(text(),‘Posts‘) and contains(@class,‘wp-first-item‘)]");
50   selenium.waitForPageToLoad("30000");
51   assertTrue(selenium.isElementPresent("//a[text()=‘New Blog Post‘]"));
52 }
53
54 @Test(description="Logs out")
55 public void logout() {
56   selenium.click("//a[text()=‘Log Out‘]");
57   //TODO:Assert
58 }

我们将使用这些测试方法(或者测试步骤)

配置方法

如果你熟悉unit测试框架,你可能知道setup、及teardown方法。TestNG将超越这种想法,并允许你在你的测试用例集、测试组或者 测试方法之前及之后定义这类方法,这对于selenium测试时非常有利的,你可以在你的测试集之前创建selenium服务及打开浏览器。

为了做到这点,我们将使用2个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文件中(我们将在下一部分看到这个)

通过加入这些注释符,TestNG引擎将自动在测试前后唤起这些方法(请确保这些测试用例被@test 注释符标识),启动和初始化selenium内容只有一次,在测试中相同的浏览器session将被复用

创建XML文件

为了定义测试的顺序,我们需要创建XML文件并列出我们想要的运行测试方法的顺序。确保这些测试用例被@test 注释符标识,否则TestNG引擎将不会执行他们。

在TestNG5.13.1之前,你不得不用Method Interceptors 如果你在XML中定义想顺序执行用例,具体可以参加作者的例子http://gist.github.com/416310,从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中启动你的测试

我们完成了测试的编写后,怎么运行他们呢?

你能启动从命令行启动TestNg、使用Eclipse插件或程序化。我们将演示使用Eclipse插件,按照步骤操作即可,具体可见TestNG的官方文档:http://testng.org/doc/download.html
如果你已经装了TestNG,你将会看到右击XML文件后有选项(RunAs-TestNG Suite)

点击“RunAs-TestNG Suite”就会开始你的测试,并且你将会看到漂亮的结果树

对未来的思考

如果你想对你的测试集未来思考的更多,我会推荐你阅读 Adam Goucher’s article 在PragPub上的,他谈论了selenium2 和 Page Objects模式(一种当你使用selenium2时非常好的模式)

由于还有很多人使用selenium1,所以这片文章还会存在,但最终会被selenium2替代

随着测试数量在测试集中的增长,你会发现他们在不同的测试类分组是个好主意。如果你这样做,你可以利用面向对象的编程方式和例如创建一个新类命名BaseTest,并留下您的配置逻辑在那里。这样,每一个测试类必须继承BaseTest类并使用静态属性。

public class WordPressAdmin extends BaseTest {
@Test
public void test1(){
  selenium.open("");
  //...
}

@Test
public void test2(){
  selenium.open("");
  //...
}
}

时间: 2024-10-24 18:33:42

TestNG-官网文档-之selenium的相关文章

Spring3.0官网文档学习笔记(一)

Part 1 Spring框架概述 Spring是模块化的,在应用中只需要引入你所需要用到的模块的jar包,其余的jar包不用引入. spring框架支持声明式的事务管理,通过RMI或web service访问你的逻辑,还有许多种方式保存数据. spring被设计成非侵入式的. 1.Spring框架简介 Spring框架提供了应用开发的基础部分,使得我们可以集中精神在业务开发层上. POJOS:plain old Java objects Spring允许创建非侵入式的POJO.这个特性支持Ja

【VR】Leap Motion 官网文档 HandModel(手部模型)

前言: 本系列译文是为迎合Unity VR的热潮与大家的学习需要,推出的针对Unity方向的Leap Motion官方文档中英对照翻译. 本篇为第六篇 <HandModel(手部模型)> ,该类主要用于连接控制器和手部模型,以及处理手臂.肘部.手掌.手指的位置和角度等信息. Handmodel is the base class for all the other hand scripts. If you are creating your own hands and need a custo

Spark--&gt;combineByKey【请阅读Apache spark官网文档】

这篇文章,很有必要看,写的不错.但是看过后,不要忘记查看Apache spark官网.因为这篇文章理解还是和源码.官网文档 不一致.有一点错误![cnblogs的代码编辑器 不支持Scala,所以 语言的关键字 没有高亮显示] 在数据分析中,处理Key,Value的Pair数据是极为常见的场景,例如我们可以针对这样的数据进行分组.聚合或者将两个包含Pair数据的RDD根据key进行join.从函数的抽象层面看,这些操作具有共同的特征,都是将类型为RDD[(K,V)]的数据处理为RDD[(K,C)

【VR】Leap Motion 官网文档 手型资源

前言: Leap Motion的官网文档已经有不少的热心网友参与了翻译,但没有覆盖官网文档的全部. 为迎合Unity VR的热潮与大家的学习需要,推出的针对Unity方向的官方文档翻译系列. 第三篇 <手型资源> 介绍了Leap Motion为Unity提供的资源包种的手型预设体资源. Hand Assets  手型资源 The Leap Motion core assets for Unity include a number of pre-made hand prefabs assets.

Spring3.0官网文档学习笔记(五)--3.3

3.3 概述 Table 3.1. The bean definition Property Explained in... class Section 3.3.2, "Instantiating beans" name Section 3.3.1, "Naming beans" scope Section 3.5, "Bean scopes" constructor arguments Section 3.4.1, "Dependen

【VR】Leap Motion 官网文档 脚本参考(目录)

前言: 本系列译文是为迎合Unity VR的热潮与大家的学习需要,推出的针对Unity方向的Leap Motion官方文档中英对照翻译. 本篇第四篇 <脚本参考> 以目录链接的形式列出了Leap Motion为Unity提供的核心资源包中所包含的脚本定义的类. 关于每个类的详细内容后续献上,敬请期待. 英文原文网址:https://developer.leapmotion.com/documentation/unity/unity/Unity_Classes.html 译文首发&持续更

Spring3.0官网文档学习笔记(六)--3.4.1

3.4 依赖 3.4.1 依赖注入 依赖注入两种方式:基于构造器的DI.基于setter方法的DI. 3.4.1.1 基于构造器的DI 参数是引入对象,且之前不存在父-子类关系: package x.y; public class Foo { public Foo(Bar bar, Baz baz) { // ... } } <beans> <bean id="foo" class="x.y.Foo"> <constructor-arg

Spring3.0官网文档学习笔记(七)--3.4.2

3.4.2 依赖与配置的细节 3.4.2.1  Straight values (primitives, Strings, and so on) JavaBeans PropertyEditors被用来转换这些value到实际的类型.? <bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <

Spring3.0官网文档学习笔记(四)--3.1~3.2.3

3.1 Spring IoC容器与Beans简介 BeanFactory接口提供对任意对象的配置: ApplicationContext是BeanFactory的子接口,整合了Spring Aop功能,消息资源控制,事件发布,应用层特殊的上下文(在web应用中) 由IoC容器实例化.组装.管理的对象都是Bean 3.2 容器概述 org.springframework.context.ApplicationContext代表Spring IoC容器,并且负责通过读取配置元数据来实例化.配置.组装

【VR】Leap Motion 官网文档 FingerModel (手指模型)

前言: 感谢关注和支持这个Leap Motion系列翻译的朋友们,很抱歉由于工作原因很久没有更新,今后这个翻译还会继续(除非官方直接给出中文文档).本篇献给大家的是 <FingerModel (手指模型)> ,该类主要用于手指模型的创建.更新.信息获取及控制等. FingerModel?  手指模型类 FingerModel is the base class for all the other finger scripts. If you are creating your own fing