This example shows basic usage of the YUI Test framework for testing browser-based JavaScript code.
Two different TestCase
objects are created and added to a
TestSuite
object. The TestRunner
is then used to run the tests once the page has loaded.
This example begins by creating a namespace:
This namespace serves as the core object upon which others will be added (to prevent creating global objects).
The first step is to create a new TestCase
object called DataTestCase
.
To do so, using the TestCase
constructor and pass in an object literal containing information about the tests to be run:
The object literal passed into the constructor contains a number of different sections. The first section contains the name
property,
which is used to determine which TestCase
is being executed. A name is necessary, so one is generated if it isn't specified.
Next, the setUp()
and tearDown()
methods are included. The setUp()
method is used in a TestCase
to set up data that may be needed for tests to be completed. This method is called immediately before each test is executed. For this example,
setUp()
creates a data object. The tearDown()
is responsible for undoing what was done in setUp()
. It is
run immediately after each test is run and, in this case, deletes the data object that was created by setUp
. These methods are optional.
The last section contains the actual tests to be run. Test method names must always begin with the word "test" (all lowercase) in order to differentiate them from other methods that may be added to the object.
The first test in this object is testName()
, which runs
various assertions on data.name
. Inside of this method, a shortcut to YAHOO.util.Assert
is set up and used to run three
assertions: isObject()
on data
, isString()
on data.name
and areEqual()
to compare
data.name
to the expected value, "yuitest". These assertions are arranged in order from least-specific to most-specific,
which is the recommended way to arrange your assertions. Basically, the third assertion is useless to run unless the second has passes and the second
can't possibly pass unless the first passed. Both isObject()
and isString()
accept a single argument, which is the value
to test (you could optionally include a failure message as a second argument, though this is not required). The areEqual()
method
expects two arguments, the first being the expected value ("yuitest") and the second being the actual value (data.name
).
The second and third tests follow the same pattern as the first with the exception that they work with different data types. The testYear()
method works with data.year
, which is a number and so runs tests specifically for numbers (areEqual()
can be used with
all data types). The testBeta()
method works with data.beta
, which is a Boolean, and so it uses the isTrue()
assertion instead of areEqual()
(though it could also use areEqual(true, this.data.beta)
).
Although it's possible that you'll have only one TestCase
object, typically there is more than one, and so this example includes
a second TestCase
. This one tests some of the built-in functions of the Array
object:
As with the first TestCase
, this one is split up into three sections: the name, the setUp()
and tearDown()
methods, and the test methods. The setUp()
method in this TestCase
creates an array of data to be used by the various
tests while the tearDown()
method destroys the array. The test methods are very simple, testing the pop()
, push()
,
and splice()
methods. Each test method uses areEqual()
exclusively, to show the different ways that it can be used.
The testPop()
method calls pop()
on the array of values, then verifies that the length of the array has changed and
that the value popped off is 4; the testPush()
pushes a new value (5) onto the array and then verifies that the length of the array has
changed and that the value is included in the correct location; the testSplice()
method tests splice()
by removing one
value that's already in the array and inserting two in its place.
To better organize the two TestCase
objects, a TestSuite
is created and those two TestCase
objects are
added to it:
The first line creates a new TestSuite
object using its constructor, which accepts a single argument - the name of the suite. As with
the name of a TestCase
, the TestSuite
name is used to determine where execution is when tests are being executed. Although
not required (one is generated if it's not provided), it is recommended that you select a meaningful name to aid in debugging.
Any number of TestCase
and TestSuite
objects can be added to a TestSuite
by using the add()
method. In this example, the two TestCase
objects created earlier are added to the TestSuite
.
With all of the tests defined, the last step is to run them. This initialization is assigned to take place when the document tree has been
completely loaded by using the Event utility's onDOMReady()
method:
Before running the tests, it's necessary to create a TestLogger
object to display the results (otherwise the tests would run
but you wouldn't see the results). After that, the TestRunner
is loaded with the TestSuite
object by calling
add()
(any number of TestCase
and TestSuite
objects can be added to a TestRunner
,
this example only adds one for simplicity). The very last step is to call run()
, which begins executing the tests in its
queue and displays the results in the TestLogger
.
You can load the necessary JavaScript and CSS for this example from Yahoo's servers. Click here to load the YUI Dependency Configurator with all of this example's dependencies preconfigured.
Copyright © 2009 Yahoo! Inc. All rights reserved.
Privacy Policy - Terms of Service - Copyright Policy - Job Openings