安装:
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(""); //... } }