UNPKG

testarmada-magellan

Version:

Massively parallel automated testing

186 lines (143 loc) 5.9 kB
Test Framework Plugins ====================== Note: This document is a work in progress. If anything seems to be out of date or incomplete, the best place for an authoritative answer is the source code of our currently-supported plugins. Plugin Module Structure ======================= A magellan test framework plugin is just a node module that exports the following signature: ```javascript { initialize: function (argv) { // argv: command line arguments and stored configuration loaded by magellan // This provides your plugin with the opportunity to look at command line arguments // and retrieve magellan configuration. }, iterator: //<< returns list of tests (see "Generating Lists of Tests" below) >> TestRun: //<< constructor for TestRun class (see "TestRun Class" below) >> filters: //<< test filter definitions (see "Test Filters" below) >> help: //<< command line help definitions (see "Command Line Help" below) >> } ``` #### Generating Lists of Tests ```javascript function getTests () { return tests; } ``` The `iterator` property of the plugin is a function that returns an array of test objects. Each object should represent exactly one test. Magellan doesn't care how the object is structured, except that the object should implement a `toString()` method so that Magellan can display a human-readable name for the test on the screen. If your test framework makes human-readable test names available and you are able to parse or query these with your plugin, it's recommended that your `toString()` implementation returns a name as opposed to a filename. For example: ```javascript > var t = new Locator("/path/to/test.js", "Should add integers and return an integer"); > t.toString() "Should add integers and return an integer" ``` #### TestRun Class ```javascript var _ = require("lodash"); var MyFrameworkTestRun = function (options) { _.extend(this, options); }; // Return command path of binary MyFrameworkTestRun.prototype.getCommand = function () { return "./node_modules/.bin/myframework"; }; // Return environment variables // Either pass-through, suppress entirely, or amend existing env supplied from magellan process MyFrameworkTestRun.prototype.getEnvironment = function (env) { return _.extend(env, { MY_EXTRA_ENVIRONMENT_VARIABLE: 123 }); }; // Return command line arguments for test framework binary // In this example, we just return our locator. See mocha plugin source for a more advanced example MyFrameworkTestRun.prototype.getArguments = function () { return [ this.locator.filename ]; }; module.exports = MyFrameworkTestRun; ``` ##### TestRun `options` supplied by `magellan` When magellan instantiates `TestRun` objects, it supplies information related to the test and environment specifically for that individual test run. The following snippet describes the supplied properties: ```javascript { // The id of this build, used by some reporters to identify the overall suite run. This // can also be used by test run implementations to identify an individual suite run as // part of some larger suite run. // NOTE: This must appear as an externally accessible property on the TestRun instance buildId: "...", // Temporary asset path that Magellan guarantees exists and only belongs to this // individual test run. Temporary files, logs, screenshots, etc can be put here. tempAssetPath: "...", // Magellan environment id (i.e. id of browser, id of device, version, etc.), // typically reflects one of the items from --browsers=item1,item2,item3 options environmentId: "...", // Test locator object originally created by plugin's iterator locator: {}, // Ports that have been found safe to use for selenium and mocking (if needed) // and are unique from any other currently-executing parallel test seleniumPort: number, mockingPort: number, // Secure tunnel id (if using sauce) tunnelId: "...", // Saucelabs configuration sauceSettings: {}, // Saucelabs desired capabilities object sauceBrowserSettings: {} } ``` Test Filters ============ The `filters` object allows for a test framework plugin to add command line switches related to filtering tests. We recommend adding at least `--tags`, `--group`, and `--test` to preserve user's expectations of ```javascript filters: { // Adds --tags=xxxx command line switch tags: function (tags, testLocator) { /* return true if testLocator satisfies tags from --tags=t1,t2,.. */ }, // Adds --group=xxxx command line switch group: function (prefix, testLocator) { /* return true if testLocator satisfies prefix from --group=a/b/c*/ }, // Adds --test=xxxx command line switch test: function (testidentity, testLocator) { /* return true if testLocator is the same as --test=path-or-name */ } }, ``` Command Line Help ================= Your test framework plugin can expose a help object which will explain the usage of the command line options added by your plugin. Here's an example, from the nightwatch plugin: ```javascript { // document the --tags option tags: { // is rendered as --tags=tag1,tag2 example: "tag1,tag2", description: "Run all tests that match a list of comma-delimited tags (eg: tag1,tag2)" }, group: { // is rendered as --group=prefix/path example: "prefix/path", description: "Run all tests that match a path prefix like ./tests/smoke" }, test: { // is rendered as --test=path/to/test.js example: "path/to/test.js", description: "Run one test with a path like ./tests/smoke/test2.js" }, nightwatch_config: { example: "path", description: "Specify nightwatch.json location (magellan-nightwatch)" } }; ``` Note that your plugin has access to magellan's `argv` object via `initialize()` (see above). You can document any switches your plugin supports in the above help object.