Testing drupal with grails webtest

I was implementing a Drupal site with a custom module that uses a custom mysql database.  The client reported problems with a custom module.  I tried reproducting the problem, but after trying 20 some combinations out of 1000+ test elements, I wasn't able to reproduce the questionable behavior.

Enter grails with webtest.

Wait... Drupal is PHP based, why grails?  Because it's easy and super fast to get things done.  Grails takes just a couple of minutes to install, installation is a 3 step process:  1) extract 2) update path 3) set env variable.  And once it's installed, it's nothing to create a grails app to do some testing.  Typically in Java development, there's a whole bunch of overhead that you need to do for web development that includes configuration of a classpath, ant file, web.xml and a myriad of other tasks dependent upon your application.  With grails, this comes ready to go, ready to run.

 I wanted to perform a data-driven webtest.  Grails has an excellent plugin for testing web applications, and it's super easy to hit a sql database with Groovy, 1-2 lines of code easy.  I couldn't think of a product in the PHP world that would offer a way to use the results of a sql query to perform a set series of HTTP POST operations against a web application.

So to summarize, in my groovy application, a query the mysql table (this can be any database if you have the JDBC driver), and for each record, I create a new drupal account (via http post to the Drupal account create page) and go to a specify page in the Drupal CMS and verify that there is specific text on that page for that specific user.  Each page is customized based upon values in this mysql database.

Install/configure grails

I begin by creating a new grails applcation:

grails create-app lawtest

I install the webtest plugin

grails install-plugin webtest

The webtest plugin comes with htmlunit version 2.4.  HtmlUnit is a java-based library that webtest uses.  Older versions of HtmlUnit do not work with recent versions of Jquery, so we have to do a "manual upgrade".  If webtest tries to parse a page with Jquery on it, it will die with a "TypeError: Cannot find function createComment in object [object]"  More info here

  • Download and extract version 2.6 of htmlunit.  Download page can be found at http://sourceforge.net/projects/htmlunit/files/
  • Copy htmlunit/lib/*.jar into your .grails/{your grails version}/projects/{your project}/plugins/webtest-1.2.3/home/lib
  • Delete your old versions of htmlunit from the directory above

I create a new webtest

grails create-webtest MyTest

Create-webtest command

There is now a file called "MyTestTests.groovy" in your grails app.  It contains a method called "testMyTestListNewDelete" that you can nuke.  I deleted everything so that I was left with just the bare class:

class MyTestTests extends grails.util.WebTest {
}

 

 

 

Start firefox and install the web-recorder plugin.  While you can easily not use this plugin and just write the code yourself, it was helpful to me as I was getting started.  For simple tests, I would not use this any longer, but if I were going the next step, I wouldn't hestiate to fire up this plugin again.  Copy the groovy output of your test into your groovy test class.  Customize to your liking.

I had to comment out things that were generated from the recorder.  I *think* the double calls were the result of some behind-the-scenes ajax in the form.  For example, here I commented out the 2nd setInputField call.

setInputField(htmlId: "edit-taxonomy-tags-13", value: "University of Pittsburgh")
//setInputField(forLabel: "Undergraduate Institution: ", value: "University of Pittsburgh")

Here's a picture of the web-recorder in action:Web-Recorder in action

 

Now paste the groovy code that you obtain from the web-recorder into your test method.  This is my modified test (please ignore the commented-out lines for now, will explain these later).

import com.canoo.webtest.WebtestCase

class MyTestTests extends grails.util.WebTest {

    void testSomething() {
        webtest("check student status ") {
            invoke "http://localhost/"
            clickLink "Prospective Students"
            clickLink "Register now!"
            def uid = "philliprhode1";
           
            setInputField(name: "name", value: uid)
            //setInputField(htmlId: "edit-name", value: "webtest1")
            setInputField(name: "mail", value: uid + "@philliprhodes.com")
            //setInputField(htmlId: "edit-mail", value: "webtest1@philliprhodes.com")
            //pass[pass2]
            setInputField(description: "Set password field pass[pass1]: phillip123", name: "pass[pass1]", value: "phillip123")
            //setInputField(description: "Set password field pass[pass1]: phillip123", htmlId: "edit-pass-pass1", value: "phillip123")
            setInputField(description: "Set password field pass[pass2]: phillip123", name: "pass[pass2]", value: "phillip123")
            //setInputField(description: "Set password field pass[pass2]: phillip123", htmlId: "edit-pass-pass2", value: "phillip123")
            setInputField(name: "field_profile_first_name[0][value]", value: "phillip")
            setInputField(htmlId: "edit-field-profile-first-name-0-value", value: "phillip")
            setInputField(name: "field_profile_last_name[0][value]", value: "test")
            setInputField(htmlId: "edit-field-profile-last-name-0-value", value: "test")
            setInputField(name: "field_profile_undergrad_gradyear[0][value]", value: "1985")
            setInputField(htmlId: "edit-field-profile-undergrad-gradyear-0-value", value: "1985")
            setInputField(name: "taxonomy[tags][10]", value: "Pittsburgh")
            setInputField(htmlId: "edit-taxonomy-tags-10", value: "Pittsburgh")
            setInputField(name: "taxonomy[tags][12]", value: "PA")
            setInputField(htmlId: "edit-taxonomy-tags-12", value: "PA")
            setInputField(name: "taxonomy[tags][11]", value: "United States")
            setInputField(htmlId: "edit-taxonomy-tags-11", value: "United States")
            setInputField(name: "taxonomy[tags][13]", value: "University of Pittsburgh")
            setInputField(htmlId: "edit-taxonomy-tags-13", value: "University of Pittsburgh")
            //setInputField(forLabel: "Undergraduate Institution: ", value: "University of Pittsburgh")
            setInputField(name: "field_profile_lsac[0][value]", value: row.lsac_no)
            setInputField(htmlId: "edit-field-profile-lsac-0-value", value: row.lsac_no)
            //setInputField(forLabel: "LSAC Number: ", value: "L12345678")
            clickButton "Create new account"
            def check = row.stat
            verifyText(description: "Verify that text is contained in the page", check)
            clickLink "Sign Out"
        }

    }
}

 

After you have pasted in the output of the web-recorder into your test, run your test using the following:

grails test-app -functional

 

Hopefully you will see something like :
Welcome to Grails 1.1.1 - http://grails.org/
Licensed under Apache Standard License 2.0
Grails home is set to: /Users/prhodes/local/grails/grails-1.1.1

Base Directory: /Users/prhodes/Documents/workspace-xx/testgl
Running script /Users/prhodes/local/grails/grails-1.1.1/scripts/TestApp.groovy
Environment set to test
    [mkdir] Created dir: /Users/prhodes/Documents/workspace-xx/testgl/test/reports/html
    [mkdir] Created dir: /Users/prhodes/Documents/workspace-xx/testgl/test/reports/plain

Starting functional tests ...

 

At the end of running your test, a browser will open up and let you know how it went:  If you had a failure, you can drill into the reports and actually see the html that was emitted from your Drupal application.

In my case, when I was running the test, I would get a failure that the Html element could not be found.  I suspect that the webrecorder was picking up some ajax events which wouldn't occur in my test, AND looking at the test code, I thought that the problem lines were duplicated in the line above, so I just commented out these lines.

Here's an example of one.  As you can see, I am setting my input field to a value of my school, and it's not required for this test to set the label for this field.  I think it's safe to comment this out.

            setInputField(htmlId: "edit-taxonomy-tags-13", value: "University of Pittsburgh")
            //setInputField(forLabel: "Undergraduate Institution: ", value: "University of Pittsburgh")

It took me a couple of runs to get my test to run correctly.

 

Now that we have a functional webtest, let's repeat implement data-driven behavior.  One note here, since this is a "WebTest" and not a Integration test, I could not just inject the datasource, so I have to create a datasource myself.  I found enough to get me going with Groovy/JDBC at http://www.ibm.com/developerworks/java/library/j-pg01115.html  To summarize, I perform a select of my status table, loop through the records and perform a webtest for each record in my table using parameters from the mysql table.  Here's my final file:

import groovy.sql.Sql

import com.canoo.webtest.WebtestCase

class MyTestTests extends grails.util.WebTest {
    void testSomething() {
        def sql = Sql.newInstance("jdbc:mysql://localhost:3306/authsum", "authsum", "authsum", "com.mysql.jdbc.Driver")
        sql.eachRow("select * from status where lsac_no != 'LSAC_Acct_No'", { row ->
                        runtest(row)
                        })
    }
   
    def runtest(def row) {
   
        println row.stat
        println row.lsac_no  
        webtest("check student status ") {
            invoke "http://localhost/"
            clickLink "Prospective Students"
            clickLink "Register now!"
            //you can increment the following and rerun the tests so that you can continually register new users
            //without getting a dup username error
            def uid = "test20" +  row.lsac_no;
           
            setInputField(name: "name", value: uid)
            //setInputField(htmlId: "edit-name", value: "webtest1")
            setInputField(name: "mail", value: uid + "@philliprhodes.com")
            //setInputField(htmlId: "edit-mail", value: "webtest1@philliprhodes.com")
            //pass[pass2]
            setInputField(description: "Set password field pass[pass1]: phillip123", name: "pass[pass1]", value: "phillip123")
            //setInputField(description: "Set password field pass[pass1]: phillip123", htmlId: "edit-pass-pass1", value: "phillip123")
            setInputField(description: "Set password field pass[pass2]: phillip123", name: "pass[pass2]", value: "phillip123")
            //setInputField(description: "Set password field pass[pass2]: phillip123", htmlId: "edit-pass-pass2", value: "phillip123")
            setInputField(name: "field_profile_first_name[0][value]", value: "phillip")
            setInputField(htmlId: "edit-field-profile-first-name-0-value", value: "phillip")
            setInputField(name: "field_profile_last_name[0][value]", value: "test")
            setInputField(htmlId: "edit-field-profile-last-name-0-value", value: "test")
            setInputField(name: "field_profile_undergrad_gradyear[0][value]", value: "1985")
            setInputField(htmlId: "edit-field-profile-undergrad-gradyear-0-value", value: "1985")
            setInputField(name: "taxonomy[tags][10]", value: "Pittsburgh")
            setInputField(htmlId: "edit-taxonomy-tags-10", value: "Pittsburgh")
            setInputField(name: "taxonomy[tags][12]", value: "PA")
            setInputField(htmlId: "edit-taxonomy-tags-12", value: "PA")
            setInputField(name: "taxonomy[tags][11]", value: "United States")
            setInputField(htmlId: "edit-taxonomy-tags-11", value: "United States")
            setInputField(name: "taxonomy[tags][13]", value: "University of Pittsburgh")
            setInputField(htmlId: "edit-taxonomy-tags-13", value: "University of Pittsburgh")
            //setInputField(forLabel: "Undergraduate Institution: ", value: "University of Pittsburgh")
            setInputField(name: "field_profile_lsac[0][value]", value: row.lsac_no)
            setInputField(htmlId: "edit-field-profile-lsac-0-value", value: row.lsac_no)
            //setInputField(forLabel: "LSAC Number: ", value: "L12345678")
            clickButton "Create new account"
            def check = row.stat
            verifyText(description: "Verify that text is contained in the page", check)
            clickLink "Sign Out"
        }

    }
}


I hope you found my write-up of data-driven testing of Drupal using the Grails application stack useful. Feel free to contact me if you find any errors or omissions related to my write-up at http://www.philiprhodes.com






 

Comments

Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.

Pada saat ada kata mutiara

Pada saat ada kata mutiara terkadang dalam hidup ini akan muncul pula kata bijak bersama datangnya kata indah lainnya. apabila kita menghindari toleransi dari kata motivasi itu sendiri.

i am very inspired from this

i am very inspired from this post. Great site catatanku

Guangdong Women's

Guangdong Women's converse,scarpe converse,converse italia,converse sito ufficiale,converse all star quarrel with her husband softball bats away louis vuitton after the lost contact chi flat iron with ugg boots,uggs outlet,ugg,uggs,ugg boots clearance,ugg australia,uggs on sale,uggs boots,ugg slippers the suspect replica watches was hollister,abercrombie,hollister sito ufficiale,abercrombie italia,abercrombie and fitch,abercrombie outlet abducted to links of london uk Fuzhou
East ugg boots News mulberry uk (trainee moncler jackets reporter louis vuitton outlet Wu Jianjie) and husband quarrel because of the family, michael kors outlet online wife from Guangzhou hollister away from home for mcm handbags almost canada goose,canada goose outlet,canada goose sale,canada goose jackets,canada goose parka,canada goose coats,cheap canada goose a month without vanessa bruno pas cher hearing ugg boots a word longchamp outlet about. And moncler,moncler three days nfl jerseys ago, north face pas cher Micro message reebok outlet an iphone 6 cases insider instyler ionic styler suddenly nike air max,air max,air max 2014,nike air max 2014,air max 90,airmax,air max 95,air max 2013,nike air max 90,nike air max 2013 the true religion jeans husband, said ray ban sunglasses his michael kors handbags wife was kidnapping gangs to lululemon,lululemon canada,lululemon outlet canada,lululemon outlet online work true religion outlet on the cheat moncler to nike trainers uk Fuzhou. timberland pas cher At abercrombie present, the tory burch outlet local true religion outlet police gucci,borse gucci,gucci sito ufficiale,gucci outlet have been involved lunette oakley pas cher in louis vuitton outlet online the investigation,
The morning ugg,uggs,uggs canada of November 6th, Guangdong Chaoyang District of coach purses Shantou city louboutin shoes in vans pas cher the nike air max village lancel of nike outlet Xi Lu nike free Che Zheng north face outlet Weihua and moncler outlet her husband swarovski uk Lan Yazhen soccer jerseys because nike tn pas cher of some family beats by dre trivial quarrel, celine handbags Zheng Weihua canada goose jackets then left nike air max uk the house, ray ban,rayban,occhiali ray ban until now, asics running shoes no audio, her lululemon outlet husband blue Yazhen also launched juicy couture outlet the relatives and louis vuitton outlet friends to find, and in November 24 ralph lauren pas cher to burberry factory outlet the local police north face outlet station to report ray ban uk to the police.
Lan Yazhen new balance shoes told ray ban sunglasses the southeast Express (reporter micro-blog), ugg uk Zheng Weihua cheap ugg boots outlet had nike air max pas cher in November nike air max uk 18th, insanity workout appeared ugg,ugg australia,ugg italia in michael kors outlet the nike free Valley Rao Zhen bottes ugg pas cher her sister factories, pandora jewelry to borrow hundreds of yuan of money north face uk to coach outlet store online buy a mobile hollister uk phone, the jimmy choo outlet second moncler,moncler outlet,moncler sito ufficiale day valentino shoes early abercrombie and fitch in hermes handbags the nike roshe uk morning toms shoes he left there, whether to prada outlet buy hermes pas cher a salvatore ferragamo mobile moncler pas cher phone he doesn't know.
The evening wedding dresses of nike blazer pas cher November 29th, Lan sac louis vuitton Yazhen received longchamp bags from Zheng lunette ray ban pas cher Weihua colleagues christian louboutin in barbour jackets uk a QQ coach outlet message burberry outlet "out of Guangdong", then no air max,nike air max news of her.
The evening marc jacobs outlet of longchamp outlet December 5th, micro canada goose pas cher letter, mont blanc a converse shoes outlet person familiar with the situation suddenly longchamp uk Lan Yazhen said ghd hair the louis vuitton handbags other side, the longchamp soldes wife canada goose outlet in the Guangdong Valley Rao christian louboutin Zhen was babyliss pro a kidnapping gangs herve leger to work on the supra shoes ground wedding dresses uk to lie kate spade outlet to Fuzhou.
According to his introduction, thomas sabo uk Zheng Weihua together with the pandora jewelry abducted nike air max another woman, this gang michael kors outlet online is starting coach outlet to Fuzhou ralph lauren,polo ralph lauren,ralph lauren outlet,ralph lauren italia,ralph lauren sito ufficiale in November 29th..
But for louboutin pas cher the gang to the two michael kors handbags women rushed prada handbags to gucci handbags Fuzhou polo lacoste pas cher where, who now canada goose where, and canada goose how abercrombie and fitch he know micro nike air force blue polo ralph lauren uk Yazhen, louis vuitton uk the michael kors uk insiders longchamp pas cher are louboutin uk not responding, hollister also replica watches refused karen millen uk to go to nike free pas cher the nike air max police station and canada goose outlet blue sub vibration.
Lan pandora uk Yazhen has burberry pas cher the louis vuitton information reported to oakley,occhiali oakley,oakley italia the nike roshe run pas cher local soccer shoes police station. He also new balance hoped that the coach outlet people of Fuzhou on Zheng Weihua abercrombie and fitch UK (Guangdong jordan pas cher Shantou sac louis vuitton city nike huarache,nike huaraches,nike air huarache Chaoyang District nike roshe run Che Xi michael kors outlet online Lu Village, 22 michael kors outlet store years old, vans,vans scarpe,vans italia height true religion outlet 1 p90x workout meters oakley sunglasses 57, oakley sunglasses short bottega veneta hair) any message can be in touch with converse him canada goose uk (phone: 13411915769QQ:727192432).
At the same uggs on sale time, he also ugg pas cher hope ralph lauren outlet to get hogan sito ufficiale the help of the police parajumpers outlet in michael kors Fuzhou. In cheap jordans this regard, Fuzhou 110 Command kate spade Center staff said that oakley sunglasses the blue sub giuseppe zanotti vibration can alarm in Guangdong sac guess pas cher local, if ralph lauren polo necessary, the Fuzhou chanel handbags police assisted mac cosmetics by the Guangdong tiffany and co jewelry police informed; swarovski jewelry the tiffany jewelry evidence by themselves or timberland shoes entrust the montre pas cher lineal relatives carrying personal identity information juicy couture outlet and moncler uk saved louboutin,louboutin outlet,louboutin outlet italia to Fuzhou to the vans outlet police louis vuitton report.

With the UGG Classic Short

With the UGG Classic Short 5281 Blackyour footwear why was created all of it C the legendary big boot considered brand s history genres. In recent years, These individuals hunter wellies undergone a designer reorganisation, And also soon be found in marbled birdwatcher ugg, So you should stay nurturing making a statement while doing so. The excessive Ugg boot styles are associated with the handy way, This is because look good pulled to pieces entirely shifting upward and it explained into using area of the down ugg offering.

Because UGG Classic Short 5281 Chocolateposition, Obtainable a lot of storage areas, Color styles, Clothing and also square sources conditions find the correct pair or frames situation. Because they fashionable shoes or shoes perhaps may be as favored you may find that you'll want to woo a wide range of frames in many different different color styles. Ugg hiking footwear united kingdom website together with coming in many different tones they come in a number in demand choices of and may be too long or short converted as well.

The actual web marvelous creation. With a se and some choices on of your mouse, Achievable pinpoint almost everything via internet, Ever most loved faraway household members you experienced wished you could not envision a lot more. But get started on your quest for markdown UGG Button Triplet Boots 1873 Chestnutfootwear by means of keyboard skills a suitable word back directly under the search local zone.

Hang jewelry incorporate girlie reason entirely. Baskeball hoop jewellery mean boldness, That can be attacked and also before progressively more women for the future. Women is just do not adequate to sore possibly poor. When your running UGG Classic Tall 5815 Chestnutpurchasing procedures is beyond what then you definitely will certainly search out for choosing qualitative along with whole stove types of pants.

In honour of Chicago's annual

In honour of Chicago's annual Marathon, Nike has hooked up Chi-town with their very own Air Max Lunar 1 WR, dressed in the signature coach wallets on sale 'Chicago Bears' colourway. The orange and blue contrast against the black upper, with coach factory outlet small detailing on the heel, lace tips and the insole reads 'Chicago Marathon'. orange nike shox Team Swoosh have made sure these Lunarlon kicks are ready for any weather, nike air max 1 they are water resistant and sport a pressure fused mesh upper. The marathon louis vuitton outlet was last weekend, so unfortunately these have already sold out from Nike.com but louis vuitton purses on sale scope out eBay for any pairs floating around.There's a ton of stores coach outlet online that sell sneakers and give a passing thought to the accessories we need cheap nike air max to keep our kicks looking fresh, but we can't think of many places coach that focus just on those extra bits. Sneaker Science is a new site nike air max from the UK that does just that though, offering up a stack of air max ltd cleaning and protection products, paints and storage solutions, laces and more. They also womens nike free sell Sneaker Freaker, wise move guys! If you're in need of any of nike outlet stores in ohio the aforementioned gear, check out Sneaker Science here.German court master Boris Becker louis vuitton outlet online would take home almost 50 titles in his glittering career, and back in cheap coach purse 1985 at Wimbledon, the writing was on the green. The 17-year-old came into the tournament unseeded louis vuitton outlet stores and left with the championship trophy. He did so wearing a pair of Pumas, and now the big cat brand are bringing the signature pair back through the Puma Select program nike air max griffey to premium CREAM stockists. They'll be rolling into stores soon, but watch the http://www.officiallouisvuittononlinestore.cc video below to get in the mood, it features Boris and his son nike outlet online store Noah talking us through the famous win.Looks like the Nike designers needed coach outlet a break from all the triple black releases and decided to vent with louis vuitton online this very Volt Air Force 1. Hat's off to you if you think nike air max 2015 you can pull this number off��.available now from Kinetics in Japan.For lovers nike air max 95 of vintage adidas Originals sneakers, the promised land does indeed exist, and it's nike total air foamposite max in Argentina. A few months ago, a band of Three Strips fiends traveled coach outlet online store to Buenos Aires after a tip-off that there was a treasure trove of louis vuitton stores untouched vintage heat hiding in a suburban shoe shop. It gets better, one louis vuitton outlet store locations of the pilgrims says what they found was, 'Beyond our wildest dreams', with louis vuitton reams of ancient rare and forgotten sneaks stacked in a labyrinthine storage room coach factory along with the humble shop front. Watch footage from the trip in the nike air max 90 video below, but for the full story, grab the latest issue of Sneaker nike shoes free shipping Freaker, we've got a massive photo feature accompanied by an interview with sneaker coach Wristlets trekker Gary Aspden.
related:
air jordan
nike foamposite
jordan chris paul

ah: about filling the

ah: about filling the database, check "dbmonster".. a cool framework for that purpose.

if you think Java is

if you think Java is complicated, few chances:

1) yu don't use Java for a long time..
2) you never used it properly ... :)
3) you definitelly don't like Java and you are desperatelly looking for an argument to publicize that out there :) eheh

* btw, grails is cool ... but for the scenario you described, Java would do the same job with the same effort..

skeptical?

1) install Maven
2) mvn archetype:generate -DarchetypeCatalog=http://download.java.net/maven/2
3) chosse option 2 and answer the 5 questions with foo data
5) mvn clean compile
6) mvn glassfish:run

Done, a web application will be available in your browser:
http://localhost:8080/artifactId/webresources/myresource

now it is time to edit the source files and include your test code.. with full debug and support of the major IDEs...

Hard work? much harder than grails? really?

my 2 Java cents.

I will have to agree to

I will have to agree to disagree with your post on 11/23/2009 at 04:07

Java would do the same job, but with EXTRA effort, not the same?!

The steps you describe may produce a helloworld j2ee web application, but that is not what Phillip needs here.

What he needs is a fast way to setup and automate (via data) integration testing...to do that is very fast and easy using grails, as Phillip has so well explained here

To do the same in java, you will have to do quite a bit more hand-holding to get it working.

Speaking as a developer who has used webtest to perform testing in both J2EE and Grails, I can vouch grails is ALOT easier to setup, hence your comments (in my opinion and experience) do not hold true.

Hope that helps others when reading this blog entry.
Conor

And as for the forms?

And as for the forms? Measurements are maxi bags are large though often carried by hand, the lines do not have middle ground, modern, square or round and feminine. The bags are carried by hand or under your arm, point out that even the clutch, except for the small jeweled versions, lengthen the measures appearing flat but at the same time almost spacious.Coach Cross Body Purses Coach Factory Outlet Coach Outlet Handbags 70% Off Coach.com Outlet Coach Outlet Handbags Bags Purses Outlet Stores -80%Off- Coach Factory Outlet Coach Outlet Store Online Coach Outlet Store Online Coach Outlet York Offer Coach Factory Outlet Save Big At Coach Outlet Stores Coach Factory Outlet Coach Store Nearest You Coach Outlet Coach Outlet Store Coach Outlet Online Coach Factory Outlet Fall 2014 Coach Factory Save Big At Coach Outlet Stores Coach Handbags Outlet Coach Handbags And Other Designer Coach Factory Outlet Coach Factory Fall 2014 Coach Outlet Online Coach Outlet York Offer Coach Outlet Store Online Coach Outlet Store bags Coach Outlet Coach Outlet Store Online Fall 2014 Coach Outlet Online Ohio State Strength Coach Coach Outlet Online Ohio State Strength Coach Coach Factory Outlet Coach Outlet USA Coach Black Friday Coach Black Friday Handbags Chanel Black Friday Save Up to 80% Off Now! Amazing Offers on Chanel Perfume Coach Outlet Line Store Coach Shoes, Handbags, Flats, Boots, Flip flops Kate Spade Outlet Online Kate Spade New York Handbags Kate Spade Handbags Amaz On Kate Spade Handbags Kate Spade Outlet Online Kate Spade Online Shopping Kate Spade Cyber Monday Kate Spade Black Friday Michael Kors Outlet Michael Kors. Sign In Michael Kors Outlet Online Michael Kors Outlet Store 80 % Off Michael Kors Outlet Michael Kors Outlet Online Or Ln-Store Michael Kors Outlet Online Michael Kors. Sign In Michael Kors Black Friday Black Friday Michaels Ad Michael Kors Handbags Sale Now Save Up To 75% Off Michael Kors Outlet Michael Kors Apparel Michael Kors Outlet Michael Kors Outlet 49.00 Michael Kors Outlet Online Michael Kors Outlet Online Sale Now Save Up To 68% Off Michael Kors Outlet Michael Kors. Sign In Louis Vuitton Outlet Louis Vuitton Outlet Stores Louis Vuitton Louis Vuitton Store Louis Vuitton Outlet Online Louis Vuitton Bags And Purses Louis Vuitton Outlet Stores Authentic Louis Vuitton Outlet Store LV Bags Louis Vuitton Handbags Louis Vuitton malletier Louis Vuitton Black Friday Louis Vuitton Outlet Deals Louis Vuitton Outlet Louis Vuitton Store Malletier Prada Outlet Prada S.p.A. Is An Italian luxury Prada Handbags Prada Handbags at Bluefly Prada Black Friday Cheap Prada Outlet Online Handbags On Clearance Marc By Marc Jacobs Marc Jacobs Handbags Celine Handbags Celine Handbags Nordstrom Celine Handbags How Much Are Celine Handbags Ray Ban Sunglasses Shop Ray Ban Sunglasses Online Oakley Sunglasses Cheap Oakleys Sunglasses Outlet Store USA With High Quality Ray-Ban Sunglasses Ray-Ban Is The Global Leader In Premium Eyewear Ray Ban Sunglasses Free Overnight Shipping & Returns Ray Ban Sunglasses Ray Ban Your Online Sunglasses Store Ray Ban Black Friday Ray Ban Black And Red Oakley Sunglasses Oakley Sunglasses Including Holbrook Oakley Sunglasses Oakley Sunglasses Outlet Up To Oakley Vault Oakley Creates Free Oakley Black Friday 100% Authentic Oakley Sale Black Friday And The Discount Toms Outlet Toms Outlet Shoes Hollister Clothing Store Hollister Clothing Abercrombie And fitch Abercrombie 30% Off Coup On Abercrombie And Fitch Off 80% On Premium Eyewear Abercrombie Abercrombie Black Friday Abercrombie Black People Polo Ralph Lauren Ralph Lauren Outlet Polo Ralph Lauren Ralph Lauren Clearance Outlet Tory Burch Outlet Tory Burch Outlet Store Tory Burch Shoes Tory Burch Outlet Online Discount Price Tory Burch Outlet Discount Tory Burch Shoes Tory Burch Black Friday Tory Burch Black Wedge Nike Air Jordan All Michael Jordan Shoes Valentino valentino.com Toms Shoes Outlet Online Toms Outlet Supra Shoes supra.com True Religion True Religion Outlet True Religion Black Friday Black True Religion Jeans Women True Religion Jeans True Religion Outlet True Religion jeans True Religion Clothing Store Tiffany Black Friday Tiffany Cyber Monday Deals Frey Wille Jewellery Frey Wille Jewellery Prices Sac Longchamp Sac Longchamps Paris Red Bottom Shoes Red Bottom Shoes Shop For And Buy Red Bottom Shoes Online Red Bottom Shoes Red Bottom Shoes Save Up To timberland Shoes Off 70% Outlet Ralph Lauren Black Friday The Latest Ralph Lauren Apparel, Accessories Michael Kors Outlet Store Michael Kors Outlet Coach Factory Store Coach Wallets for Women Burberry Handbags Burberry Handbags on Clearance Burberry Oultet Online Burberry Factory Outlet Store Chanel Outlet Online Chanel Factory Outlet Store Online Chanel Handbags Authentic Cheap Chanel Handbags CoCo Chanel Chanel Perfume Mademoiselle 50% Off 75% Off Website Bold clutches, modern backpacks, embellished totes: This season was all about a statement accessory. Here, all the best, busiest bags we want to grab onto.

The described Maven approach

The described Maven approach is simply setting up the necessary build structure. Sure you can add dependencies, integrate the project into your IDE, and you're off to the races. But, again, Grails was ideally suited for this specific case of webtesting because:

  1. testing convention
  2. dynamic nature with facilitation of Groovy + Java
  3. Webtest plugin integration

+1 @Conor

Filling database with right

Filling database with right data is essential for complex functional testing. Basically without database fixtures it is impossible.

I was thinking a lot about implementing functional testing and grails looks like great tool to go with.

Thanks for pointing out! Nice post, easy to read :)

Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.

Post new comment

  • Web page addresses and e-mail addresses turn into links automatically.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Lines and paragraphs break automatically.

More information about formatting options

CAPTCHA
This question is for testing whether you are a human visitor and to prevent automated spam submissions.
9 + 7 =
Solve this simple math problem and enter the result. E.g. for 1+3, enter 4.