diff --git a/docs/source/guides/tests.rst b/docs/source/guides/tests.rst
new file mode 100644
index 00000000..0dcbcf40
--- /dev/null
+++ b/docs/source/guides/tests.rst
@@ -0,0 +1,56 @@
+Automated tests
+===============
+
+Summary
+*******
+
+Weboob is a wide project which has several backends and applications, and changes can impact a lot of subsystems. To be sure that everything works fine after an important change, it's necessary to have automated tests on each subsystems.
+
+How it works
+************
+
+You need `nose `_ installed.
+
+To run the automated tests, use this script::
+
+ $ tools/run_tests.sh
+
+It looks for every files named ``test.py``, and find classes derivated from ``TestCase`` of ``BackendTest`` (in :class:`weboob.tools.test`).
+
+Then, it run every method which name starts with ``test_``.
+
+Write a test case
+*****************
+
+Normal test
+-----------
+
+Use the class :class:`TestCase ` to derivate it into your new test case. Then, write methods which name starts with ``test_``.
+
+A test fails when an assertion error is raised. Also, when an other kind of exception is raised, this is an error.
+
+You can use ``assert`` to check something, or the base methods ``assertTrue``, ``assertIf``, ``failUnless``, etc. Read the `unittest documentation `_ to know more.
+
+Backend test
+------------
+
+Create a class derivated from :class:`BackendTest `, and set the ``BACKEND`` class attribute to the name of the backend to test.
+
+Then, in your test methods, the ``backend`` attribute will contain the loaded backend. When the class is instancied, it loads every configured backends of the right type, and randomly choose one.
+If no one is found, the tests are skipped.
+
+Example::
+
+ from weboob.tools.test import BackendTest
+
+ class YoutubeTest(BackendTest):
+ BACKEND = 'youtube'
+
+ def test_youtube(self):
+ l = [v for v in self.backend.iter_search_results('lol')]
+ self.assertTrue(len(l) > 0)
+ v = l[0]
+ self.backend.fillobj(v, ('url',))
+ self.assertTrue(v.url and v.url.startswith('http://'), 'URL for video "%s" not found: %s' % (v.id, v.url))
+
+Note: ``BackendTest`` inherits ``TestCase``, so the checks work exactly the same, and you can use the same base methods.