Re: Single file tests

On 02/04/2014 10:30 , Simon Pieters wrote:
> On Wed, 02 Apr 2014 00:07:49 +0200, James Graham
> <james@hoppipolla.co.uk> wrote:
>> So one request I've had from people at Mozilla used to writing
>> Mochitests is an easier way to write testharness.js tests,
>> particularly for the special case where there is exactly one test per
>> file. This is a interesting case because the file itself provides the
>> isolation that we usually try to obtain by wrapping each test step in
>> a function() {}, so it is possible to cut out some of the verbosity.
>> An example of the kind of result we might get is
>>
>> <doctype html>
>> <title>Example test</title>
>> <script src=/resources/testharness.js></script>
>> <script src=/resources/testharnessreport.js></script>
>> <script>
>> setup({file_is_test:true})
>>
>> onload = function() {assert_true(true); done()}
>>
>> I think there are some possible disadvantages to this; in particular
>> it might encourage people to put a whole load of things that should be
>> separate tests as multiple asserts in one file in a way that will
>> break if one assert doesn't work in a particular browser. However it
>> does seem like if used wisely it could be a win, and might help sell
>> the idea of writing testharness.js tests going forward at Mozilla.
>> What do people think?
>
> I think it's a good idea. But it would be nice to minimize the boilerplate.

Agreed.

> The snippet above omits <div id="log"></div> which is currently
> required, but the script could create it if it's missing.

The script could also inject the link to testharnessreport.js if it 
isn't there? It's a little bit tricky due to existing content but maybe 
given a flag? The flag wouldn't be very useful if that's all it did, but 
it could also take care of setup({file_is_test:true}).

Also, do we really need to run onload for most tests?

   <!doctype html>
   <title>Example test</title>
   <script src=/resources/testharness.js data-test></script>
   <script>
   onload = function() {assert_true(true); done(); };

Crudely:

if (document.currentScript.dataset.test !== undefined) {
     var s = document.createElement("script");
     s.src = document.currentScript.src.replace("testharness", 
"testharnessreport");
     s.onload = function () { setup({file_is_test:true}); };
     document.currentScript.after(s);
}

I wonder if we could ditch the onload too. Other option:

   <!doctype html>
   <title>Example test</title>
   <script src=/resources/testharness.js></script>
   <script>
   run(function() {assert_true(true); done(); });

Again, crudely:

function run (fn) {
     if (!document.query("script[src$=testharnessreport.js]")) {
         var ref = document.query("script[src$=testharness.js]")
         ,   s = document.createElement("script")
         ,   log = document.createElement("div")
         ;
         log.id = "log";
         document.body.appendChild(log);
         s.src = ref.src.replace("testharness", "testharnessreport");
         s.onload = function () {
             setup({file_is_test:true});
             fn();
         };
         ref.after(s);
     }
}

I dunno, just a thought.

-- 
Robin Berjon - http://berjon.com/ - @robinberjon

Received on Wednesday, 2 April 2014 09:57:34 UTC