More links fixed
[mono.git] / web / testing
1 * Testing
2
3         Testing is an important part of the Mono project: every one of its
4         three major components has a test suite tailored for its needs.  This
5         is very helpful, because in the course of developing the software it
6         is very common to introduce bugs in existing code.  A test suite
7         helps us fix the bugs as soon as they are introduced.
8
9         There are various kinds of tests in Mono:
10         <ul>
11                 <li><a href="#unit"><b>Class Library Unit
12                 Tests:</b></a> These are used to test the class
13                 libraries.
14
15                 <li><a href="#compiler"><b>Compiler tests</b></a>: Both
16                 tests that should pass and tests that should fail are included. 
17
18                 <li><a href="#runtime"><b>Runtime tests</b></a>: Tests for 
19                 the virtual machine.
20
21                 <li><a href="#aspnet"><b>ASP.NET tests</b></a>: ASP.NET tests.
22
23                 <li><a href="#ws"><b>Web Services tests</b></a>: Web Services 
24                 client/server tests.
25         </ul>
26
27 <a name="unit"></a>
28 * Class Library Tests
29
30         All classes in Mono libraries should have comprehensive unit test
31         suites to go with them.  Unit testing is a software engineering
32         methodology that makes it easier to build correct code.  Every
33         method in every class should have a set of tests to verify
34         that they work correctly.  Mono also needs a testing framework
35         to make it easy to write and run lots of tests. 
36
37         In some classes, we might also provide standalone tests because of
38         some reasons such as too huge testcases, another downloading and so on.
39         (For example, managed XSLT has standalone test which downloads and
40         expands some megabytes of OASIS test suite.)
41
42         Here I list them up as long as I know. If you are going to add another
43         standalone tests, please add one line here. It is also recommended that
44         you add some notes on how to build and run tests.
45
46         <ul>
47
48                 * Mono.Data/test/
49                 * System.Data/Test, and some individual ADO.NET libraries:
50                   there are some standalone tests. See the bottom of <a href="ado-net.html">
51                   ADO.NET page</a> for detail.
52                 * System.Web/Test/TestMonoWeb : see README
53                 * System.Web.Services/Test/standalone : see README
54                 * System.Windows.Forms/SWFTest/
55                 * System.XML/Tests/System.Xml.Schema/standalone_tests : see README
56                 * System.XML/System.Xml.Serialization/standalone_tests/
57                 * System.XML/Tests/System.Xml.Xsl/standalone_tests : see README
58
59         </ul>
60
61 ** Getting started
62
63         If you are new to writing NUnit tests, there is a template you may use
64         to help get started. The file is:
65
66                 <b>mcs/class/doc/TemplateTest.cs</b>
67
68         Save a copy of this file in the appropriate test subdirecty
69         (see below), and replace all the {text} markers with
70         appropriate code. Comments in the template are there to guide
71         you. You should also look at existing tests to see how other
72         people have written them.
73         mcs/class/corlib/Test/System.Collections/CollectionBaseTest.cs
74         is a small one that might help.
75
76         The directory that will contain your new file depends on the
77         assembly/namespace of the class for which you are creating the
78         tests.  Under mcs/class there is a directory for each
79         assembly. In each assembly there is a Test directory,
80         e.g. mcs/class/corlib/Test. In the Test directory there are
81         sub-directories for each namespace in the assembly,
82         e.g. mcs/class/corlib/Test/Sytem. Put your new test file in
83         the appropriate sub-directory under Test for the class you are
84         testing.
85         
86         Once all of that is done, you can do a 'make test' from the top mcs
87         directory.  Your test class will be automagically included in the
88         build and the tests will be run along with all the others.
89
90 * Tips on writing Unit tests.
91
92         You should look at the <a href="http://nunit.org">NUnit documentation</a>,
93         as it is a fantastic product, and includes fantastic documentation,
94         but here are some tips for those of you who are already reading
95         this web page.
96
97
98 ** Provide an unique error message for Assert()
99
100         Include an unique message for each Assert() so that when the assert
101         fails, it is trivial to locate it in the source. Otherwise, it may be
102         difficult to determine which part of the test is failing. A good way
103         to ensure unique messages is to use something like #A01, #A02 etc.
104
105             Ok:
106         <pre>
107         
108                 AssertEquals("array match", compare[0], i1[0]);
109                 AssertEquals("array match", compare[1], i1[1]);
110                 AssertEquals("array match", compare[2], i1[2]);
111                 AssertEquals("array match", compare[3], i1[3]);
112         </pre>
113
114             Excellent:
115         <pre>
116                 AssertEquals("#A01", compare[0], i1[0]);
117                 AssertEquals("#A02", compare[1], i1[1]);
118                 AssertEquals("#A03", compare[2], i1[2]);
119                 AssertEquals("#A04", compare[3], i1[3]);
120         </pre>
121         
122         Once you used such a number in an Assert(), don't change it later on -
123         people might use it it identify the test in bug reports or in mailing
124         lists.
125
126 ** Use AssertEquals() to compare things, not Assert().
127
128         Do not compare two values with Assert() - if the test fails,
129         people have no idea what went wrong while AssertEquals()
130         reports the failed value.
131
132         Ok:
133         <pre>
134                 Assert ("A01", myTicks[0] == t1.Ticks);
135         </pre>
136
137         Excellent:
138         <pre>
139                 AssertEquals ("A01", myTicks[0], t1.Ticks);
140         </pre>
141
142 ** Test your test with the Microsoft runtime
143         
144         If possible, try to run your testsuite with the Microsoft runtime on
145         .NET on Windows and make sure all tests in it pass. This is especially
146         important if you're writing a totally new testcase - without this
147         check you can never be sure that your testcase contains no bugs ....
148         
149         Don't worry if you're writing your test on Linux, other people can
150         test it for you on Windows.
151         
152         Sometimes you may discover that a test doesn't show the expected
153         result when run with the Microsoft runtime - either because there is a
154         bug in their runtime or something is misleading or wrong in their
155         documentation. In this case, please put a detailed description of the
156         problem to mcs/class/doc/API-notes and do also report it to the 
157         <a href="mailing-lists.html">mailing list</a> - we'll forward this to the
158         Microsoft people from time to time to help them fix their documentation
159         and runtime.
160
161 ** Unit tests.
162
163         Why do unit testing? It becomes simple to run automated tests
164         for the whole library. Unit tests are a safety net - you can
165         change part of the code and verify that you haven't broken
166         anything. Ideally, tests are written before the actual library
167         code itself. And every time a bug is discovered, a test should
168         be written to demonstrate the bug and its fix. Then, if
169         you ever reintroduce the bug, you will know immediately. For
170         more info, read <a
171         href="http://junit.sourceforge.net/doc/testinfected/testing.htm">
172         JUnit Test Infected: Programmers Love Writing Tests</a>.
173
174
175 ** Getting Started
176
177         We welcome all contributions to the Class Libary Test Suite.
178
179         There is information to help you get started in CVS at
180         mcs/class/doc/NUnitGuidelines. Once you have written your test, please
181         post it to <a href="mailing-lists.html">mono-list</a>.
182
183         Someone will make sure to add the file or apply the patch as
184         appropriate. If you plan to be an on-going contributor and
185         would like to get cvs account, email <a href="mailto:miguel@ximian.com">miguel</a>.
186
187         Normally, after you send a couple of well-written new files
188         and/or patches to the list, you will be given cvs access.
189
190 <a name="compiler"></a>
191 * Compiler tests
192
193         Mono ships with three compilers: C#, VB.NET and JScript.  The
194         tests are ran by running the makefile target `make
195         run-test-local' in the appropriate directory.
196
197         The C# compilation tests live in mcs/tests, and the C# error
198         tests live in mcs/errors.
199
200         The VB.NET compilation tests live in mcs/btests. 
201
202 <a name="runtime"></a>
203 * Runtime Tests
204
205         These tests verify the virtual machine, to run these tests, do:
206
207 <pre>
208         cd mono/mono/tests
209         make test
210 </pre>
211
212 <a name="aspnet"></a>
213 * ASP.NET tests
214
215         XSP, the Mono ASP.NET server has tests for ASP.NET pages. It uses
216         <a href="http://nunitasp.sourceforge.net">NUnitAsp</a>. Right now
217         it only has standalone tests, ie., tests that do not need their own
218         global.asax or web.config files.
219
220         If you want to run them, get the xsp CVS module and install it. Then:
221 <pre>
222         cd xsp/nunit-tests
223         make
224         cd standalone
225         xsp
226 </pre>
227
228         And from another terminal:
229 <pre>
230         cd xsp/nunit-tests/standalone
231         nunit-console standalone-tests.dll
232 </pre>
233
234 <a name="ws"></a>
235 * Web Services tests
236
237         The Test directory for the System.Web.Services assembly contains a
238         standalone test suite for testing web services. It tests:
239
240         <ul>
241         <li>Proxy generation using the wsdl tool</li>
242         <li>Access to web services using the generated client proxies</li>
243         <li>Execution of web services in the server</li>
244         </ul>
245
246         This suite not only tests web services running on XSP, but it can also test
247         services running on other platforms and that are available in internet. This
248         will help track down interoperability issues.
249
250         To build the test suite, just run:
251         
252 <pre>
253         cd mcs/class/System.Web.Services/Test/standalone
254         xsp --root server
255 </pre>
256         
257         And from another terminal:
258 <pre>
259         cd mcs/class/System.Web.Services/Test/standalone
260         make
261         nunit-console testclient.dll
262 </pre>
263         
264         This will download the wsdl documents, generate the proxies, build a dll with
265         the proxies, and build the nunit tests. Then you can use nunit-console or
266         gnunit to run the tests (the nunit dll is testclient.dll).
267
268         Read the README file in mcs/class/System.Web.Services/Test/standalone for
269         more info.