diff --git a/README.rst b/README.rst index 92932a312..f246ea9bc 100644 --- a/README.rst +++ b/README.rst @@ -95,14 +95,69 @@ Developing and Hacking So, you would like to help out with developing the Runestone Components. What do you need to know? -1. Make a Fork of this repository. -2. Setup your environment on your development machine +1. Make a Fork of this repository. +2. Set up your environment on your development machine - 1. Make a virtual environment for testing and working I recommend pyvenv-3.4 as it is baked in to Python 3.4 and higher. - 2. Rather than following the instructions above for installing runestone simply run ``pip install -e .`` from the top level runestone directory. This will install all of the required prerequisites and setup the runestone install as a link to the development directory. + 1. Make a virtual environment for testing and working (I recommend pyvenv-3.4 as it is baked in to Python 3.4 and higher) + 2. To use Runestone Components, rather than following the instructions above for installing runestone simply run ``pip install -e .`` from the top level runestone directory. This will install all of the required prerequisites and setup the runestone install as a link to the development directory. 3. When you have some changes to share, make a Pull Request. +(See the RunestoneServer repository and **http://runestoneinteractive.org** for more complete documentation on how this project works.) + +Writing Tests +------------- + +A great way to contribute to the Runestone Components repository is to add to our test suite. + +Our goal is to have unit tests which rely on Selenium (a library that helps simulate interactions in a web browser) for each directive, to see if the JavaScript that powers the directives is working correctly. + +**In order to get started with writing a test/writing additional tests, you will need the following:** + +* ``pip install selenium`` in the virtualenv you're using for Runestone Components development + +* Download `PhantomJS `_., which is a driver that helps you simulate the browser. You can download it `here `_. + +* You'll also need to have done the above installation. + + * You should be using virtual environment, you'll need a clone of the RunestoneComponents repository, and you'll need to have done ``pip install -e`` from the top level of the RunestoneComponents directory. + +**To run tests:** + +* Make sure the directory containing the PhantomJS executable is in your ``PATH`` environment variable. e.g. ``PATH=$PATH:path/to/thedirectory/where/it/is/here`` at your command line (or edit your ``.bash_profile``). + +* Check out the existing tests, e.g. the ``test_question.py`` file that tests the Question directive, which you can find at the path ``/runestone/question/test/test_question.py``, for an example. + +* Each directive's individual set of tests requires a mini book. You'll see a ``_sources`` folder for each existing test containing an ``index.rst`` file. That file contains a title, as required by ``.rst``, and whatever directive examples you want to test. + +* Finally, to run a test, ensuring that you have accessed a ``test`` folder within a directive folder, type the following at the command prompt in this order: + + * ``runestone build`` (to build the mini-book for testing) + + * ``runestone serve --port 8081 &`` + + * ``python .py``, e.g. ``python test_question.py`` + +.. note:: + + 8081 is the default test port. See the Python files, e.g. ``test_question.py``, to see how this is set up. The ``&`` will set the process to run in the background. The mini-book needs to be served in order to test what's in the DOM as a result of using these components! + +You should then see some test output, showing a pass (``ok``), FAIL, or error(s). + +If you have an error relating to PhantomJS/a driver in the output, you probably have a PATH or driver installation problem. + +**To write a new test:** + +* Create a ``test`` directory inside a directive's folder + +* Create a Python file to hold the test suite inside that directory, e.g. ``test_directivename.py`` + +* Run ``runestone init`` inside that folder and answer the following prompts + +* Write the appropriate directive example(s) inside the ``index.rst`` file (which will be created as a result of ``runestone init``) + +* Edit the Python file you created as appropriate (see documentation for the Python ``unittest`` module `here `_.) + Notes for more Advanced Users -----------------------------