方俊贤 (Ken Fang) 首席咨询顾问, 雅各布森软件(北京)有限公司 微信号: Kenfang - Lisp
方俊贤 (Ken Fang) 首席咨询顾问, 雅各布森软件(北京)有限公司 微信号: Kenfang - Lisp
,
: KenFang_Lisp
JavaScript
JUnit
JUnit
JavaScript
QUNIT
QUnit: http://qunitjs.com/
Qunit lib :
qunit-1.15.0.css
qunit-1.15.0.js
QUnit test runner page: BasicRunner.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>QUnit test runner</title>
<link rel="stylesheet" href="lib/qunit-1.15.0.css>
</head>
<body>
<div id="qunit"></div>
<div id="qunit-fixture"></div>
<script src="lib/qunit-1.15.0.js"></script>
</body>
</html>
QUnit Test
module("Investment", {
setup: function() {
stock = new Stock();
investment = new Investment({
stock: stock, ( User Story)
shares: 100,
sharePrice: 20
});
}, teardown: function() {
delete stock;
delete investment;
} User Story (
});
equal()
A non-strict comparison, roughly equivalent to JUnits assertEquals.
notEqual()
A non-strict comparison, checking for inequality.
ok()
A boolean check, equivalent to CommonJSs assert.ok() and JUnits
assertTrue(). Passes if the first argument is truthy.
JavaScript QUnit test runner page : BasicRunner.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>QUnit test runner</title>
<link rel="stylesheet" href="lib/qunit-1.15.0.css">
</head>
<body>
<div id="qunit"></div>
<div id="qunit-fixture"></div>
<script src="lib/qunit-1.15.0.js"></script>
<script src="src/Stock.js"></script>
<script src="src/Investment.js"></script>
<script src="test/InvestmentTest.js"></script>
</body>
</html>
JavaScript
JS-TEST-DRIVER (JSTD)
js-test-driver (JSTD)
JavaScript , :
TestRunner
js-test-driver, :
js-test-driver JavaScript
js-test-driver JUnit ,
JavaScript ; ,
HTML
: JavaScript , , js-
test-driver
js-test-driver (JSTD)
https://code.google.com/p/js-test-driver/
assertEquals([msg], expected, actual) Fails if the expected and actual values can not be
compared to be equal.
assertNotEquals([msg], expected, actual) Fails if the expected and actual values can be
compared to be equal.
assertSame([msg], expected, actual) Fails if the expected and actual values are not
references to the same object.
assertNotSame([msg], expected, actual) Fails if the expected and actual are references to
the same object
assertNull([msg], actual) Fails if the given value is not exactly null.
https://code.google.com/p/js-test-driver/wiki/Assertions
Test Case
Inline declaration
TestCase("MyTestCase", {
testA:function(){
},
testB:function(){
}
});
Prototype
MyTestCase = TestCase("MyTestCase");
MyTestCase.prototype.testA = function(){
};
MyTestCase.prototype.testB = function(){
};
,
setUp()
tearDown()
Test Case
TestCase("strftimeTest", {
setUp: function () {
this.date = new Date(2014, 9, 12, 20, 10, 40);
},
tearDown: function () {
delete this.date;
},
});
Configuration File (jsTestDriver.conf)
server: http://localhost:9876
load:
- src/*.js
- test/*.js
https://code.google.com/p/js-test-driver/wiki/ConfigurationFile
Starting the server & Capturing browsers
https://code.google.com/p/js-test-driver/wiki/CommandLineFlags
Safari Firefox
Eclipse
https://code.google.com/p/js-test-driver/wiki/UsingTheEclipsePlugin
Intellij
https://code.google.com/p/js-test-driver/wiki/IntelliJPlugin
JUnit , :
JUnit
inputs
Test Class SUT
direct
outputs
:
@Test
public, JUnit
void ,
import org.junit.Test;
import static org.junit.Assert.assertEquals;
direct
}
@Test
ExampleTest DefaultController
public void testProcessRequest() {
Response response = controller.processRequest( request );
assertNotNull( "Must not return a null response", response );
}
@Test
public void testAddHandler() { outputs
RequestHandler handler2 = controller.getHandler( request );
assertSame( "Controller.getHandler must return the samplehandler", handler2, handler );
}
@After
}
,
, , ,
() , ,
, ,
JUnit Mockito, ,
,
User Story
: ;
: ; SUT DOC
: ; SUT DOC (Test Spy)
: ; SUT DOC
: ;
: SUT;
: ;
: ;
: ;
: SUT;
: ;
: ;
User Story:
User Story
, User Story
,
TEST SPY
inputs outputs
Test Class SUT MOCK
Indirect
direct
DOCs
Stub/ Dummy
outputs inputs MOCK
: ;
/* Create DOCs */
Subscriber subscriber = mock(Subscriber.class);
News news = mock(News.class);
}
}
TEST SPY
inputs outputs [Subscriber]
Test Class SUT MOCK
Indirect
[DailyNewsService]
direct
[DailyNewsServiceTes]
DOCs
Dummy
outputs [News]
inputs MOCK
: ; SUT DOC
Indirect
direct
[DailyNewsServiceTes] [DailyNewsService]
DOCs
Dummy
outputs [News]
inputs MOCK
: ; SUT DOC (Test Spy)
public class DailyNewsServiceTest {
@Test
public void SubscriberShouldReceiveNews() {
/* Create SUT */
DailyNewsService dailynews = new DailyNewsService();
/* Create DOCs */
Subscriber subscriber = mock(Subscriber.class);
News news = mock(News.class);
/* DOC SUT */
dailynews.addSubscriber(subscriber);
/* SUT */
dailynews.send(news);
[DailyNewsServiceTes] [DailyNewsService]
DOCs
Dummy[News]
outputs inputs MOCK
: ; SUT DOC
/* SUT: DailyNewsService */
public class DailyNewsService {
Indirect
direct
[DailyNewsServiceTes] [DailyNewsService]
DOCs
Dummy
outputs [News]
inputs MOCK
: ;
TEST SPY
inputs outputs
[Subscriber]
Test Class SUT MOCK
Indirect
[DailyNewsService]
direct
[DailyNewsServiceTes]
DOCs
Dummy
[News]
outputs inputs MOCK
: SUT;
Indirect
direct
[DailyNewsServiceTes] [DailyNewsService]
DOCs
Dummy
outputs [News]
inputs MOCK
: ;
: ;
@Test
public void newsShouldBeSentToAllSubscribers() {
/* Create SUT */
DailyNewsService dailynews = new DailyNewsService();
/* Create DOCs */
Subscriber subscriberA = mock(Subscriber.class, "subscriberA");
Subscriber subscriberB = mock(Subscriber.class, "subscriberB");
News news = mock(News.class);
/* DOC SUT */
dailynews.addSubscriber(subscriberA);
dailynews.addSubscriber(subscriberB);
/* SUT */
dailynews.send(news);
TEST SPY
MOCK [Subscriber A]
TEST SPY
inputs outputs
[Subscriber B]
Test Class SUT MOCK
Indirect
[DailyNewsService]
direct
[DailyNewsServiceTes]
DOCs
Dummy
[News]
outputs inputs MOCK
: SUT;
TEST SPY
MOCK [Subscriber A]
Indirect
MOCK
direct
[DailyNewsService]
DOCs
Dummy
outputs inputs [News]
MOCK
: ;
: ;
public class DailyNewsServiceTest {
.
@Test
public void notSubscribedShouldNotReceiveNews() {
/* Create SUT */
DailyNewsService dailynews = new DailyNewsService();
/* Create DOCs */
Subscriber subscriberX = mock(Subscriber.class, "subscriberX");
Subscriber subscriberY = mock(Subscriber.class, "subscriberY");
News news = mock(News.class);
/* SUT */
dailynews.send(news);
Mockito never(); ,
JavaScript
JUint
inputs
Test Class SUT
direct
outputs
;
Indirect
MOCK
direct
[DailyNewsService]
DOCs
Dummy
outputs inputs [News]
MOCK