From 5e19bfd47b0bb8adca75133541540a0ee64a18af Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 18 Feb 2013 09:47:28 +0100 Subject: [PATCH] [WIP] testing in module guide bzr revid: xmo@openerp.com-20130218084728-q92rcstsr2ca8pqa --- addons/web/doc/module.rst | 88 ++++++++++++++++++++++++++++ addons/web/doc/module/22 | 6 ++ addons/web/doc/module/23 | 14 +++++ addons/web/doc/module/24 | 10 ++++ addons/web/doc/module/25 | 55 +++++++++++++++++ addons/web/doc/module/26 | 30 ++++++++++ addons/web/doc/module/series | 5 ++ addons/web/doc/module/testing_0.png | Bin 0 -> 23285 bytes addons/web/doc/widget.rst | 2 +- 9 files changed, 209 insertions(+), 1 deletion(-) create mode 100644 addons/web/doc/module/22 create mode 100644 addons/web/doc/module/23 create mode 100644 addons/web/doc/module/24 create mode 100644 addons/web/doc/module/25 create mode 100644 addons/web/doc/module/26 create mode 100644 addons/web/doc/module/testing_0.png diff --git a/addons/web/doc/module.rst b/addons/web/doc/module.rst index 2e38733a25d..138a8e91a4c 100644 --- a/addons/web/doc/module.rst +++ b/addons/web/doc/module.rst @@ -303,6 +303,94 @@ Note that we're only displaying the record once we know it's been saved from the database (the ``create`` call has returned without error). +Mic check, is this working? +--------------------------- + +So far, features have been implemented, code has been worked and +tentatively tried. However, there is no guarantee they will *keep +working* as new changes are performed, new features added, … + +The original author (you, dear reader) could keep a notebook with a +list of workflows to check, to ensure everything keeps working. And +follow the notebook day after day, every time something is changed in +the module. + +That gets repetitive after a while. And computers are good at doing +repetitive stuff, as long as you tell them how to do it. + +So let's add test to the module, so that in the future the computer +can take care of ensuring what works today keeps working tomorrow. + +.. note:: + + Here we're writing tests after having implemented the widget. This + may or may not work, we may need to alter bits and pieces of code + to get them in a testable state. An other testing methodology is + :abbr:`TDD (Test-Driven Development)` where the tests are written + first, and the code necessary to make these tests pass is written + afterwards. + + Both methods have their opponents and detractors, advantages and + inconvenients. Pick the one you prefer. + +The first step of :doc:`testing` is to set up the basic testing +structure: + +1. Creating a javascript file + + .. patch:: + +2. Containing a test section (and a few tests to make sure the tests + are correctly run) + + .. patch:: + +3. Then declaring the test file in the module's manifest + + .. patch:: + +4. And finally — after restarting OpenERP — navigating to the test + runner at ``/web/tests`` and selecting your soon-to-be-tested + module: + + .. image:: module/testing_0.png + :align: center + + the testing result do indeed match the test. + +The simplest tests to write are for synchronous pure +functions. Synchronous means no RPC call or any other such thing +(e.g. ``setTimeout``), only direct data processing, and pure means no +side-effect: the function takes some input, manipulates it and yields +an output. + +In our widget, only ``format_time`` fits the bill: it takes a duration +(in milliseconds) and returns an ``hours:minutes:second`` formatting +of it. Let's test it: + +.. patch:: + +This series of simple tests passes with no issue. The next easy-ish +test type is to test basic DOM alterations from provided input, such +as (for our widget) updating the counter or displaying a record to the +records list: while it's not pure (it alters the DOM "in-place") it +has well-delimited side-effects and these side-effects come solely +from the provided input. + +Because these methods alter the widget's DOM, the widget needs a +DOM. Looking up :doc:`a widget's lifecycle `, the widget +really only gets its DOM when adding it to the document. However a +side-effect of this is to :js:func:`~openerp.web.Widget.start` it, +which for us means going to query the user's times. + +We don't have any records to get in our test, and we don't want to +test the initialization yet! So let's cheat a bit: we can manually +:js:func:`set a widget's DOM '); ++ // Then set it on the widget ++ w.setElement($fixture); ++ ++ // Update the counter with a known value ++ w.update_counter(22733958); ++ // And check the DOM matches ++ strictEqual($fixture.text(), '06:18:53'); ++ ++ w.update_counter(73451828) ++ strictEqual($fixture.text(), '20:24:11'); ++ }); ++ test('display_record', function (instance, $fixture) { ++ var w = new instance.web_example.Action(); ++ $fixture.append('
    ') ++ ok(false, "test display records"); ++ }); + }); diff --git a/addons/web/doc/module/series b/addons/web/doc/module/series index 6271f474f0b..491e7dc3c59 100644 --- a/addons/web/doc/module/series +++ b/addons/web/doc/module/series @@ -17,3 +17,8 @@ 19 20 21 +22 +23 +24 +25 +26 diff --git a/addons/web/doc/module/testing_0.png b/addons/web/doc/module/testing_0.png new file mode 100644 index 0000000000000000000000000000000000000000..62711799ff7320f162a8107fefeed3ad7e1219a4 GIT binary patch literal 23285 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 B6FL9@ literal 0 HcmV?d00001 diff --git a/addons/web/doc/widget.rst b/addons/web/doc/widget.rst index 483c6a6a418..7c4a2374b3e 100644 --- a/addons/web/doc/widget.rst +++ b/addons/web/doc/widget.rst @@ -93,7 +93,7 @@ The DOM root can also be defined programmatically by overridding Any override to :js:func:`~openerp.web.Widget.renderElement` which does not call its ``_super`` **must** call :js:func:`~openerp.web.Widget.setElement` with whatever it - generated or the widget's behavior is undefined.r + generated or the widget's behavior is undefined. .. note::