public
Description: BDD for OpenLaszlo.
Homepage:
Clone URL: git://github.com/osteele/lztestkit.git
lztestkit / README
100644 162 lines (120 sloc) 6.462 kb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
= LZTestKit
 
This package extends lzunit with behavioral testing, asynchronous
test support, test case selection, and automated test sequencing.
 
* <b>Test case selection</b> runs a single test case within a test
  applet, without modifying the sources. (You supply the name of the
  test case as a query parameter in the application URL.) It allows
  you to use your test applet as your debugging scaffolding, without
  running a lot of code that you aren't interested in.
 
* <b>Automated test sequencing</b> runs all the test applets in a
  directory, in series, in a single browser window, stopping if one of
  them has an error. It allows you to run all of a package's test
  cases from the browser by visiting a single url, instead of
  navigating to each url in turn.
 
* <b>Behavioral testing</b> implements mocks, stubs, and expectations.
  It allows you to *test* one class, while *stubbing* the classes that
  it depends on. You can even verify that the tested class makes
  functions thatyou expect it to. This is a loose port of rspec to
  OpenLaszlo.
 
* <b>Asynchronous test support</b> allows you to write a test case
  that is only considered complete when the callback functions or
  delegates that it defines return. If a test case creates a callback
  function, the test case is only complete when the callback function
  returns. (Except if the callback function creates a callback
  function, etc.)
 
== Requirements
 
This package requires OpenLaszlo 3.4.0 or 4.0.6. (Other versions
might work, but aren't tested.)
 
== Installation
 
* Download the latest version from {download-location}.
 
* Unpack it into your OpenLaszlo webapp directory; for example, at
  <tt>${OPENLASZLO_HOME}/Server/lps-3.4.0/lztestkit</tt>.
 
* Visit e.g. http://127.0.0.1:8080/openlaszlo-4.0.6/lztestkit/examples
  and http://127.0.0.1:8080/openlaszlo-4.0.6/lztestkit/test. (The
  first part of the path will be different if you've got a different
  version of OpenLaszlo, or if you've installed the servlet instead of
  the server). You should be able to click on the examples and tests
  in order to run them.
 
== Features
 
=== Test case selection
 
If a test application is compiled with support for test case selection, you
can invoke it with a <tt>testCase=<em>{testCaseName}</em></tt> query parameter
to run only the test case named <em>{testCaseName}</em>.
 
Include <tt>lzunit-extensions.js</tt> in your application (or include
<tt>library.lzx</tt>, which includes this). Then, include the
testCase={testCaseName} query parameter in the URL that you use to
open the application, where {testCaseName} is the name of the test
case. Only this test case will execute.
 
See the example in <tt>examples/test-selection.lzx</tt>.
 
=== Automated test sequencing
 
Copy <tt>test/autorun/index.jsp</tt> into your test directory to run
all the test applications in that directory within a single browser
window, without user interaction.
 
Copy <tt>test/autorun/index.jsp</tt> into your test directory, and
update the includes at the top of the file to reflect the paths to the
lztestkit <tt>src</tt> and <tt>lib</tt> subdirectories. By default,
this file will run files in its directory that match /test-*.lzx/;
this is a configuration parameter that it should be obvious how to
change.
 
Each test cases should include <tt>autorun-lz.js</tt> via <script
src="autorun-lz.js"/>. If you have a <tt>library.lzx</tt> file with
test scaffolding, you can place that directive there.
 
==== Support files
<tt>autorun-lz.js</tt>:: implements the OpenLaszlo side of automated execution
<tt>autorun-browser.js</tt>:: implements browser support
<tt>autorun-include.jsp</tt>:: is a JSP include that embeds the files in the current directory into the generated HTML for the index page
<tt>jquery-1.2.1.min.js</tt>:: is the jQuery library. I didn't write this! but the browser support file needs it
<tt>swfobject.js</tt>:: is the swfobject library. I didn't write this! but the browser support file needs it
 
 
=== Behavioral testing
 
TODO
 
This lets you write things like this in a test case:
 
  myMockObject = Mock.Create(MyClass);
  myMockObject.mock.expects.aMethod(1, 'arg', {name:2});
  // call a fn that invokes myMockObject.aMethod(1, 'arg', {name:2})
  myMockObject.mock.verify();
 
  myMockObject.stub('aMethod', 'arg1', 'arg2', Function)
    .by.calling(1);
  // call a fn that invokes myMockObject.aMethod('arg1', 'arg2', function(n) {...})
  // and expects the funarg to be called back with n=1
 
  calling(anObject, 'methodName', 'arg1')
    .should.call(otherObject, 'method', 'some', 'arguments')
    .and.send(anObject, 'onchange', 'data')
    .and.returnWith(1)
 
  constructing('MyClass', 'initarg')
    .should.call(otherObject, 'method', 'some', 'arguments')
 
==== Implementation
 
<tt>lzmock.js</tt>:: TODO
<tt>lzspec.js</tt>:: TODO
<tt>lzunit-extensions.js</tt>:: adds <tt>assertNotEquals</tt>, <tt>assert[Not]Contains</tt>, and <tt>assertFasterThan</tt> methods to <tt>TestCase</tt>
<tt>jsspec.js</tt>:: js-level support for lzspec (without OpenLaszlo dependencies)
<tt>hopkit.js</tt>:: support file for jsspec and lzmock
 
=== Asynchronous test support
 
TODO
 
This features allows lzunit to run asynchronous tests, which are not
complete until a delegate or callback has been called. A typical
usage pattern is the following test, which asserts that setTimeout
delays at least the requested amount of time:
 
  <method name="testSetTimeout" args="c">
    var interval = 1000,
        startTime = new Date;
    // c(function(){...}) is equivalent to function(){...}
    // except that it re-enters the dynamic bindings of the
    // test case.
    setTimeout(c(function() {
      var endTime = new Date;
      assertTrue(endTime - startTime >= interval);
    }), interval);
  </method>
 
For now, see <tt>examples/test-lzunit-async.lzx</tt>. The new methods are
also copiously documented in <tt>src/lzunit-async.lzx</tt>.
 
== Support Files
 
The browser support for autorun relies on jQuery and swfobject. I've
included versions of these in the <tt>src</tt> directory.
 
The behavioral testing files use hopkit.js to define chains.
<tt>hopkit</tt> isn't otherwise ready for general release; and it's
not necessary to use this file directly.
 
== License
 
LzTestKit is copyright (c) 2007 Oliver Steele. It is open-source
software, and may be redistributed under the terms of the MIT
license. The text of this licence is included in the LzTestKit
distribution.