Benoit Girard: Testing a JS WebApp |
I’ve been putting off testing my cleopatra project for a while now https://github.com/bgirard/cleopatra because I wanted to take the time to find a solution that would satisfy the following:
After a bit of research I came up with a solution that addressed my requirements. I’m sharing here in case this helps others.
First I found that the easiest way to achieve this is to find a Test Framework to get 1) and find a solution to run a headless browser for 3.
For the Test Framework I picked QUnit. I didn’t have any strong requirements there so you may want to review your options if you do. With QUnit I load my page in an iframe and inspect the resulting document after performing operations. Here’s an example:
QUnit.test("Select Filter", function(assert) { loadCleopatra({ query: "?report=4c013822c9b91ffdebfbe6b9ef300adec6d5a99f&select=200,400", assert: assert, testFunc: function(cleopatraObj) { }, profileLoadFunc: function(cleopatraObj) { }, updatedFiltersFunc: function(cleopatraObj) { var samples = shownSamples(cleopatraObj); // Sample count for one of the two threads in the profile are both 150 assert.ok(samples === 150, "Loaded profile"); } }); });
Here I just load a profile, and once the document fires an updateFilters event I check that the right number of samples are selected.
You can run the latest cleopatra test here: http://people.mozilla.org/~bgirard/cleopatra/test.html
Now that we have a page that can run our test suite we just need a way to automate the execution. Turns out that PhantomJS, for webkit, and SlimerJS, for Gecko, provides exactly this. With a small driver script we can load our test.html page and set the process return code based on the result of our test framework, QUnit in this case.
If you hooked up the browser driver to run via a simple test.sh script adding continuous integration should be simple. Thanks to Travis-CI and Github it’s easy to setup your test script to run per check-in and set notifications.
All you need is to configure Travis-CI to looks at your repo and to check-in an appropriate .travis.cml config file. Your travis.yml should configure the environment. PhantomJS is pre-installed and should just work. SlimerJS requires a Firefox binary and a virtual display so it just requires a few more configuration lines. Here’s the final configuration:
env: - SLIMERJSLAUNCHER=$(which firefox) DISPLAY=:99.0 PATH=$TRAVIS_BUILD_DIR/slimerjs:$PATH addons: firefox: "33.1" before_script: - "sh -e /etc/init.d/xvfb start" - "echo 'Installing Slimer'" - "wget http://download.slimerjs.org/releases/0.9.4/slimerjs-0.9.4.zip" - "unzip slimerjs-0.9.4.zip" - "mv slimerjs-0.9.4 ./slimerjs" notifications: irc: channels: - "irc.mozilla.org#perf" template: - "BenWa: %{repository} (%{commit}) : %{message} %{build_url}" on_success: change on_failure: change script: phantomjs js/tests/run_qunit.js test.html && ./slimerjs/slimerjs js/tests/run_qunit.js $PWD/test.html
Happy testing!
https://benoitgirard.wordpress.com/2015/01/28/testing-a-js-webapp/
Комментировать | « Пред. запись — К дневнику — След. запись » | Страницы: [1] [Новые] |