我们开发的应用程序不能有任何错误,必须按照预期精确地执行,更重要的是在应用程序中添加新的特性时,保证不破坏任何原有内容。为了做到以上要求,最原始的做法是,每次有更改时刷新浏览器,每处点击进行验证,来保证一切正常。这样的做法速度慢而不够精确。我们可以通过编程进行软件测试,系统地检查各项功能。
Jasmine是一个测试驱动的JavaScript开发框架。在这里下载独立发行版本,其中包含测试所需要的所有文件,打开SpecRunner.html
将会运行被包含的规则(specs)。将SpecRunner.html
的<head>
内部的源文件和specs链接替换成你自己的。
相关的几个名词####
describe: 定义了一套测试内容,由一组相关的spec组成。describe是一个全局函数,有两个参数,一个string(测试集的名称或标题——通常是什么正在测试),一个function,该函数是实现该测试集的代码块。测试嵌套。
Spec: 由全局函数It定义,包含一个string和一个function,string是Spec的标题。function是Spec的测试内容,一个Spec包含一个或多个测试状态的期望(Expectations, 真或假的断言 ),所有测试状态的值为 True时此 Spec通过测试。
Expectations: 期望是由函数 expect(带有一个实际值作为参数)建立。 expect 被匹配函数链接到期望得到的值。
** Matchers: 每一个匹配函数用于实现 真实值 与 期望值 之间的布尔比较,并向框架Jasmine报告期望的值。Jasmine** 会根据期望的值判断包含此期望的Spec的测试是否通过。
一个完整的测试文件:######
describe("Player", function() {
var player;
var song;
beforeEach(function() {
player = new Player();
song = new Song();
});
it("should be able to play a Song", function() {
player.play(song);
expect(player.currentlyPlayingSong).toEqual(song);
//demonstrates use of custom matcher
expect(player).toBePlaying(song);
});
describe("when song has been paused", function() {
beforeEach(function() {
player.play(song);
player.pause();
});
it("should indicate that the song is currently paused", function() {
expect(player.isPlaying).toBeFalsy();
// demonstrates use of 'not' with a custom matcher
expect(player).not.toBePlaying(song);
});
it("should be possible to resume", function() {
player.resume();
expect(player.isPlaying).toBeTruthy();
expect(player.currentlyPlayingSong).toEqual(song);
});
});
// demonstrates use of spies to intercept and test method calls
it("tells the current song if the user has made it a favorite", function() {
spyOn(song, 'persistFavoriteStatus');
player.play(song);
player.makeFavorite();
expect(song.persistFavoriteStatus).toHaveBeenCalledWith(true);
});
//demonstrates use of expected exceptions
describe("#resume", function() {
it("should throw an exception if song is already playing", function() {
player.play(song);
expect(function() {
player.resume();
}).toThrowError("song is already playing");
});
});
});