greyhound
v0.0.3
Published
End-to-end browser testing framework
Readme
Greyhound (alpha)
An end-to-end testing framework for node
Installation
The following instructions will only work after the first proper release
- Install the Selenium Chrome Driver
- Create a NPM module:
mkdir my-e2e-testing && cd my-e2e-testing && npm init - Install Greyhound:
npm i --save greyhound - Check that it works:
greyhound -h
Getting Started
- Create the required directories
mkdir -p test-scripts/pages - Create a page object:
# test/scripts/pages/google/home.coffee
{Page} = require "greyhound"
class GoogleHome extends Page
configure: ->
@options.url = "http://www.google.com"
searchBox: ->
@findElement css: "input[name='q']"
searchFor: (query) ->
@searchBox().sendKeys "#{query}\n"
module.exports = GoogleHomeOr in Javascript:
// test/scripts/pages/google/home.js
var Page = require("greyhound").Page,
util = require("util");
function GoogleHome() {
this.constructor.super_.apply(this, arguments);
}
util.inherits(GoogleHome, Page);
util._extend(GoogleHome.prototype, {
configure: function () {
this.options.url = "http://www.google.com";
},
searchBox: function () {
this.findElement({css: "input[name='q']"});
},
searchFor: function (query) {
this.searchBox().sendKeys(query + "\n");
}
});
module.exports = GoogleHome;Or in LiveScript:
# test/scripts/pages/google/home.ls
{Page} = require \greyhound
class GoogleHome extends Page
configure: ->
@options.url = \http://www.google.com
search-box: ->
@find-element css: \input[name:'q']
search-for: (query) ->
@search-box!send-keys "#query\n"
module.exports = GoogleHome- Create your first test script:
# test-scripts/google-search.coffee
{TestScript} = require "greyhound"
GoogleHome = require "./pages/google/home"
class GoogleSearch extends TestScript
configure: ->
@options.scriptName = "Google Search"
execute: ->
homePage = @page GoogleHome
homePage.visit()
homePage.searchFor "Greyhound"
module.exports = GoogleSearchOr in JavaScript:
// test-scripts/google-search.js
var TestScript = require("greyhound").TestScript,
GoogleHome = require("./pages/google/home"),
util = require("util");
function GoogleSearch() {
this.constructor.super_.apply(this, arguments);
}
util.inherits(GoogleSearch, TestScript);
util._extend(GoogleSearch.prototype, {
configure: function () {
this.options.scriptName = "Google Search";
},
execute: function () {
var homePage = this.page(GoogleHome);
homePage.visit();
homePage.searchFor("Greyhound");
}
});
module.exports = GoogleSearch;Or in LiveScript:
# test-scripts/google-search.ls
require! {
greyhound.TestScript
\./pages/google/home
util
}
class GoogleSearch
configure: ->
@options.script-name = 'Google Search'
execute: ->
home-page = @page GoogleHome
home-page.visit!
home-page.search-for \Greyhound
module.exports = GoogleSearch
4. Run your script `$ greyhound google-search`
5. View the report in a browser
Contributing
------------
### Setup
Here's my recommended set-up while developing on this project:
1. Make sure you have the required packages installed for [Growl](https://github.com/visionmedia/node-growl).
2. Fork/clone the project somewhere locally `git clone [email protected]:MyMedsAndMe/greyhound.js.git`
3. Install all dependencies and globally link it `sudo npm link`
4. Run the builder `npm run watch-compile`. As the project is built in CoffeeScript, this will continually compile the project to JavaScript, watching the files for any changes.
5. Open another terminal and run the tests `npm run watch-test`. This will run the tests everytime you change a test file.
6. If you want to try Greyhound in another project, while still developing on it, create your project and link your local version of Greyhound: `npm link greyhound` (make sure you have followed step 3 first).
### Coding standards
- All files to be named in lowercase and the words to be separated with hyphens.
- Variables, properties, methods and functions to be named in camelcase, first letter must be lowercase.
- Classes to be named in camelcase, first letter must be uppercase.
- Use CoffeeScript's style of string concatenation.
- Leave an empty line at the end of every file.
- Functions to have a gap between the properties and the arrow. Ie `(prop, prop2) ->`
- Functions without properties don't include the paranthesis `->`
- Be as clean as possible, make your code semantic and make your code readable without comments. Ie, use lots of nicely named functions instead.