blob: 762b338440cc584379431f4381ad9ad802d37a15 [file] [log] [blame] [view]
> [!IMPORTANT]
> This page was copied from https://github.com/dart-lang/sdk/wiki and needs review.
> Please [contribute](../CONTRIBUTING.md) changes to bring it up-to-date -
> removing this header - or send a CL to delete the file.
---
# Who is this article for?
If you are writing tests of core parts of the Dart SDK, there are special
tools to run these tests on browsers. If you are writing tests for a package
that is not part of the Dart SDK distribution, then
[package:test](http://github.com/dart-lang/test/blob/master/README.md),
previously called "unittest", is the best way for you to write your unit tests
for browsers and the standalone Dart vm. Published Dart packages are
automatically tested using [Drone.io](http://readme.drone.io/pub/overview).
The remainder of this article is about the browser test infrastructure for
core Dart libraries and tools in the Dart repository. These test suites
are run by the tools/test.py tool,
and can be run on web browsers as well as the standalone Dart vm.
In the most common case, Dart scripts are wrapped in an automatically-created
HTML wrapper page, and compiled to JS using dart2js, to run on web browsers.
Usually, this is the best way to test dart:html or other web features,
but a few complex cases require us to write a custom html file, rather
than using the HTML wrapper file.
# Details
A test script testing Dart's web libraries, for example a test in
tests/html, will create the DOM elements it needs to test in the test
script itself. WebPlatformTest tests in the test/co19 test suite will
add HTML or DOM elements to the document, and then operate on them.
This is the best way to create and test a web page. For example, the
test
WebPlatformTest/html/semantics/tabular-data/the-table-element/insertRow-method\_t01.dart
contains the following Dart code:
```dart
const String htmlEL = r'''
<div id="test">
<table>
<tr>
<td>
</table>
</div>
''';
void main() {
document.body.appendHtml(htmlEL);
...
}
```
## Running Tests
When a test is run on a browser, the wrapper HTML file, and the
modified or compiled Dart scripts are put into a directory called
generated\_tests, under the build directory that the Dart executable
and SDK are built in. The test server runs a local HTTP server, that
serves files from the build directory, and also from the Dart
repository root, and starts a browser that runs the tests fetched from
this server. To debug a test, you can start this HTTP server, and
then open the test's web page manually in a browser. The output of
test.py includes the command lines necessary to do this.
## Custom HTML Tests
If a test requires a custom HTML file, and cannot be written by adding
DOM elements to a page after it is loaded, then the test scripts allow
you to write the HTML file separately, and use it instead. There are
two systems for doing this. The first system adds a custom HTML file
to the test called foo\_test.dart by putting an HTML file called
foo\_test.html in the same directory. The second system creates a
test from any file ending in `_htmltest.html` in that directory, like
bar\_htmltest.html.
### `_test.html` custom HTML files
To be filled in
### `_htmltest.html` tests
An HTML file with a name that ends in `_htmltest.html` will be read by
the test infrastructure, and metadata about what scripts are used and
what messages the test should post to the document window is read from
an annotation in that file.
The annotation is a JSON dictionary, embedded between two delimiters,
and it can be put inside an HTML comment so that the unprocessed page
looks like valid HTML:
```html
<!--
START_HTML_DART_TEST
{
"scripts": ["scripts_test_dart.dart", "scripts_test_js.js"],
"expectedMessages": ["crab", "fish", "squid", "sea urchin"]
}
END_HTML_DART_TEST
-->
```
The test will pass if the web page posts all the strings in the
expectedMessages property to its top-level window, for example by
executing lines like
```javascript
window.postMessage('squid', '*');
```
Scripts in the 'scripts' property of the annotation will be
automatically copied from the test directory to the generated-test
directory, and compiled from dart to js if necessary. The script tags
using Dart scripts should be written exactly like
```html
<script src="foo.dart" type="application/dart"></script>
```
in order for the test generation to find and modify them.
In order for the test framework to catch all errors in this HTML test,
the first script that executes on this page must be:
```html
<script>window.parent.dispatchEvent(new Event('detect_errors'));</script>
```
This allows the test framework
to attach an error handler to the window at the first opportunity,
before the scripts being tested have run.