NoseJS is a Nose plugin to run JavaScript tests using Rhino in a Java subprocess.
Install
First, you need to download Rhino. More on that below.
You can get NoseJS with easy_install
$ easy_install NoseJS
Or you can clone the source using Mercurial from http://bitbucket.org/kumar303/nosejs/ and install it with
$ python setup.py develop
Usage
Here is the most basic way to invoke NoseJS (assumes you’ve downloaded Rhino into ~/src)
$ nosetests --with-javascript --rhino-jar ~/src/rhino1_7R1/js.jar
This command would look for any files along Nose’s path ending in .js that match Nose’s current test pattern, collect them all, then execute them using Rhino in a single Java subprocess at the end of all other tests. By default, files looking like test*.js will be collected and run.
The idea behind NoseJS is that you might have a Python web application that relies on JavaScript for some of its functionality and you want to run both Python and JavaScript tests with one command, nosetests. You can put these JavaScript tests wherever you want in your project.
Here is a more realistic example that shows how the Fudge project is tested simultaneously for Python and JavaScript functionality. Its project layout looks roughly like this:
|-- fudge | |-- __init__.py | |-- patcher.py | |-- tests | | |-- __init__.py | | |-- test_fudge.py | | |-- test_patcher.py |-- javascript | |-- fudge | | |-- fudge.js | | |-- tests | | | |-- test_fudge.html | | | `-- test_fudge.js `-- setup.py
Both Python and JavaScript tests can be run with this command:
$ nosetests --with-javascript \
--rhino-jar ~/src/rhino1_7R1/js.jar \
--with-dom \
--js-test-dir javascript/fudge/tests/
......................................................
----------------------------------------------------------------------
Test Fake
can find objects
can create objects
expected call not called
call intercepted
returns value
returns fake
Test ExpectedCall
ExpectedCall properties
call is logged
Test fudge.registry
expected call not called
start resets calls
stop resets calls
global stop
global clear expectations
Loaded 6 JavaScript files
OK
----------------------------------------------------------------------
Ran 54 tests in 0.392s
OK
The dots are the Python tests that were run and the output below that is what Fudge’s JavaScript test files printed out. Be sure to read the Caveats section below ;)
Specifying a path to JavaScript files
If JavaScript files are nested in a subdirectory, like the above example, specify that directory with:
$ nosetests --with-javascript --js-test-dir javascript/fudge/tests/ --js-test-dir ./another/dir
nosejs JavaScript namespace
All JavaScripts have the nosejs JavaScript namespace available for use. The following methods are available:
nosejs.requireFile(path)
Load a JavaScript file from your test script. If you require the same file multiple times, it will only be loaded once. If the file does not start with a slash, then it should be a path relative to the directory of the script where requireFile() was called from. For example, here is how test_fudge.js requires the fudge library before testing:
if (nosejs) { nosejs.requireFile("../fudge.js"); }
nosejs.requireResource(name)
Require a JavaScript file that is bundled with NoseJS. There are a few available resources:
- jquery-1.3.1.js
Will load the JQuery library before loading any other tests
- jquery/qunit-testrunner.js
Will load a very minimal set of JavaScript functions for testing. It is a partial implementation of the QUnit test runner interface. Supported methods: module(), test(), equals(), ok(), and expect()
For example, test_fudge.js uses jquery and the testrunner
if (nosejs) { nosejs.requireResource("jquery-1.3.1.js"); nosejs.requireResource("jquery/qunit-testrunner.js"); nosejs.requireFile("../fudge.js"); }
Using the DOM
If your JavaScript under test relies on a browser-like DOM environment, it might still work! Just run:
$ nosetests --with-javascript --with-dom
This will load a copy of John Resig’s env.js script to simulate a DOM before loading any other JavaScript. There are a few very minor patches made to env.js, marked with @@nosejs in the NoseJS source.
Caveats
Currently if JavaScript tests fail, nosetests will not indicate failure and its exit status will be unaffected. I can’t figure out a clean way to do this. Please get in touch if you’d like to help.
In general, JavaScript tests are not very well integrated into Nose.
Wait … Python and Java?
Rhino is pretty much the only stable, command line oriented implementation of JavaScript I know of and it’s well supported by Mozilla.
Alternatively, John J. Lee created a Python binding to the fast Spider Monkey engine, Atul Varma revived it once in a fork on Google Code, and now Paul J. Davis is working on it (in git and it is released on PyPI). I have only had success in building Atul’s fork and unfortunately the error messages leave a lot to be desired. However, I have a basic implementation of NoseJS that supports a --spidermonkey option, which switches out the JavaScript engine. The code is here in a fork: http://bitbucket.org/kumar303/nosejs-spidermonkey/.
Once Python Spidermonkey becomes a bit more stable it would be nicer than Rhino because tests could be executed inline alongside other Python tests without the overhead of starting up a Java process.
Contributing
Please submit bugs and patches. All contributors will be acknowledged. Thanks!
Changelog
0.9.1
Fixed distribution problem
0.9
Initial release
Metadata
Release files for NoseJS 0.9.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| NoseJS-0.9.1.tar.gz | 47.7 kB | Without provenance | Details |
Release files / NoseJS-0.9.1.tar.gz
| Download URL | NoseJS-0.9.1.tar.gz |
|---|---|
| Size | 47.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
20c6e774dca946d4e3c8111a7e8dd91eef98025a924f1b2102ac42acafd2c4e4
|
|
BLAKE2b-256 checksum How to use checksums |
b8b4e3a6d8095baf8bf88348efc60b93eaf9d52fdcf8f35a1c85c1f3d6d9688e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
Security for NoseJS 0.9.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.