Distributed continuous integration testing for JavaScript.
Switch branches/tags
Nothing to show
Clone or download
Latest commit c420076 Jun 4, 2018
Type Name Latest commit message Commit time
Failed to load latest commit information.
cache Check filemtime only if the file is readable, prevent errors on first… Apr 9, 2012
config Don't index /client/ pages Jul 16, 2015
css api: Add basic help page with overview of available actions and formats Mar 23, 2017
external build: Update jQuery to 1.12 Jul 10, 2017
img BrowserInfo: Update Safari logo Sep 12, 2015
inc RunPage: Move iframes container to be before the history element Aug 23, 2017
js inject: Fix trailing comma from 8df31d0 Aug 23, 2017
scripts scripts: Add script to abort old runs that cannot be rerun Jun 23, 2017
test prettyDate: Use singular instead of plural for "1 week" Jul 18, 2017
.gitignore scripts: Add script to abort old runs that cannot be rerun Jun 23, 2017
.jshintignore build: Update Travis CI configuration Jun 24, 2015
.jshintrc js: Conform with jQuery JavaScript Style Guide Jan 15, 2014
.travis.yml build: Set sudo:false in Travis configuration Jul 9, 2016
AUTHORS.txt Add "Reset failed jobs" button. Fixes #222. Closes #235. Nov 2, 2012
CONTRIBUTING.md Docs: Removed IRC channel links in CONTRIBUTING.md Dec 31, 2013
History.md Tag v1.1.0 Jun 4, 2018
LICENSE.txt Build: Remove dates from copyright notice Dec 30, 2014
README.md README: Add Travis CI badge Mar 23, 2017
api.php api: Ensure api-error page can render Jun 23, 2017
composer.json build: Update ua-parser Mar 30, 2017
index.php Page: Implement partial response support for JobPage Jul 10, 2017
package.json test: Add tests for pretty.js Jul 18, 2017


Build Status

TestSwarm - Distributed Continuous Integration for JavaScript

TestSwarm provides distributed continuous integration testing for JavaScript.

The main instance monitoring jQuery core and related projects runs at swarm.jquery.org.

Project Status

TestSwarm is still in use in projects of the jQuery Foundation, but it isn't under active development anymore. Although critical issues may be patched in the future, most open issues will remain unaddressed.

Within the jQuery Foundation, we're experimenting with alternative projects, to eventually shut down our own instance of TestSwarm:

We recommend reviewing those and other alternatives.

Quick start

Clone the repo, git clone --recursive git://github.com/jquery/testswarm.git.


TestSwarm uses the Semantic Versioning guidelines as much as possible.

Releases will be numbered in the following format:


The -alpha suffix is used to indicate unreleased versions in development.

For more information on SemVer, please visit http://semver.org/.

Bug tracker

Found a bug? Please report it using our issue tracker!


Environmental compatibility

To run TestSwarm you will need a web server, a database server and PHP. At the moment TestSwarm supports the following, but other configurations may work as well.

  • Apache 2.0+, NGINX 1.2+
  • PHP 5.4+ (or PHP-FPM for NGINX)
  • MySQL 4.0+
  • cURL (for the cleanup action; see step 8)


  1. Create an empty MySQL database and create a user with read and write access to it.

  2. Copy config/sample-localSettings.php to config/localSettings.php
    Copy config/sample-localSettings.json to config/localSettings.json.
    Edit localSettings.json and replace the sample settings with your own.
    Refer to the Settings page for more information.

  3. For Apache:
    Copy config/sample-.htaccess to .htaccess.
    To run TestSwarm from a non-root directory, set web.contextpath in localSettings.json to the correct path from the web root and update RewriteBase in .htaccess. Verify that .htaccess is working properly by opening a page other than the HomePage (e.g. /testswarm/projects) in your browser.
    Required Apache configuration:

    • AllowOverride is set to All (or ensure FileInfo is included).
    • mod_rewrite installed and loaded.

    For NGINX:
    Copy config/sample-nginx.conf to /etc/nginx/sites-available.
    The file name should match your domain e.g. for swarm.example.org:
    cp config/sample-nginx.conf /etc/nginx/sites-available/swarm.example.org.conf
    Open this conf file in your editor and replace the "example" values with the correct values.
    Make sure your install is located at /var/www/testswarm (otherwise update the file to match the correct location).
    Now you need to link the sites-available config to the sites-enabled config:
    (replace the "swarm.example.org" with your own file name):
    ln -s /etc/nginx/sites-available/swarm.example.org.conf /etc/nginx/sites-enabled/swarm.example.org.conf
    Now make sure that php-fpm is running: /etc/init.d/php-fpm status
    if is not running start it: /etc/init.d/php-fpm start

  4. Copy config/sample-robots.txt to robots.txt
    Or, if TestSwarm is not in the root directory, add similar rules to your root robots.txt.

  5. Set storage.cacheDir to a writable directory that is not readable from the web. Either set it to a custom path outside the document root, or use the default cache directory (protected with .htaccess).
    Chmod it: chmod 777 cache.

  6. Install dependencies composer install

  7. Install the TestSwarm database by running: php scripts/install.php

  8. Create an entry in your crontab for action=cleanup. This performs various cleaning duties such as making timed-out runs available again.
    * * * * * curl -s http://swarm.example.org/api.php?action=cleanup > /dev/null

  9. Create a project and submit jobs.

Get involved

You're welcome to use the GitHub issue tracker to start discussions.

Or post to the QUnit and Testing forum.

Most of us are also on IRC in the #jquery-dev channel at irc.freenode.net

Planning for TestSwarm and other projects related to testing of javascript applications based around jQuery happens on the jQuery Testing Team wiki


Copyright and license

See LICENSE.txt.


TestSwarm was originally created by John Resig as a basic tool to support unit testing of the jQuery JavaScript library. It was later moved to become an official Mozilla Labs and has since moved again to become a jQuery project.