邯郸建设局网站,汉邦未来网站开发有限公司,三网合一网站,域名购买推荐编写junit 测试最近#xff0c;我为一个小型个人项目编写了很多Jasmine测试。 我花了一些时间才终于感到正确地完成了测试。 在此之后#xff0c;当切换回JUnit测试时#xff0c;我总是很难过。 由于某种原因#xff0c;JUnit测试不再那么好#xff0c;我想知道是否有可能… 编写junit 测试 最近我为一个小型个人项目编写了很多Jasmine测试。 我花了一些时间才终于感到正确地完成了测试。 在此之后当切换回JUnit测试时我总是很难过。 由于某种原因JUnit测试不再那么好我想知道是否有可能以类似于Jasmine的方式编写JUnit测试。 Jasmine是一个受RSpec Ruby BDD测试框架启发的流行JavaScript行为驱动开发测试框架。 一个简单的茉莉花测试如下所示 describe(AudioPlayer tests, function() {var player;beforeEach(function() {player new AudioPlayer();});it(should not play any track after initialization, function() {expect(player.isPlaying()).toBeFalsy();});...
}); 第一行中的describe函数调用使用AudioPlayer tests描述创建了一个新的测试套件。 在测试套件中我们可以使用it创建测试在Jasmine中称为specs。 在这里我们检查创建新的AudioPlayer的isPlaying方法是否返回false。 AudioPlayer实例。 用JUnit编写的相同测试如下所示 public class AudioPlayerTest {private AudioPlayer audioPlayer;Before public void before() {audioPlayer new AudioPlayer();}Testvoid notPlayingAfterInitialization() {assertFalse(audioPlayer.isPlaying());}...
} 我个人认为Jasmine测试与JUnit版本相比更具可读性。 在Jasmine中对测试没有任何影响的唯一噪音是花括号和function关键字。 其他所有内容都包含一些有用的信息。 在阅读JUnit测试时我们可以忽略诸如void访问修饰符私有公共..注释和不相关的方法名称如以Before注释的方法名称之类的关键字。 除此之外以驼峰案例方法名称编码的测试描述不太好读。 除了提高可读性外我真的很喜欢Jasmine嵌套测试套件的功能。 让我们来看一个更长的示例 describe(AudioPlayers tests, function() {var player;beforeEach(function() {player new AudioPlayer();});describe(when a track is played, function() {var track;beforeEach(function() {track new Track(foo/bar.mp3)player.play(track);});it(is playing a track, function() {expect(player.isPlaying()).toBeTruthy();});it(returns the track that is currently played, function() {expect(player.getCurrentTrack()).toEqual(track);});});...
}); 在这里我们创建了一个子测试套件负责测试AudioPlayer播放曲目时的行为。 内部的beforeEach调用用于为子测试套件内的所有测试设置通用的前提条件。 相反在JUnit中为多个但不是全部测试共享通用的前提条件有时会变得很麻烦。 当然在测试中复制设置代码是不好的因此我们为此创建了额外的方法。 为了在设置和测试方法之间共享数据例如上面示例中的track变量我们必须使用成员变量范围更大。 另外我们应确保将具有类似前提条件的测试分组在一起以避免需要阅读整个测试类来查找特定情况下的所有相关测试。 或者我们可以将事情分成多个较小的类。 但是然后我们可能必须在这些类之间共享设置代码…… 如果我们查看Jasmine测试就会发现该结构是通过调用全局函数例如describeit…并传递描述性字符串和匿名函数来定义的。 有了Java 8我们有了Lambdas所以我们可以做同样的事情吗 是的我们可以在Java 8中编写如下代码 public class AudioPlayerTest {private AudioPlayer player;public AudioPlayerTest() {describe(AudioPlayer tests, () - {beforeEach(() - {player new AudioPlayer();});it(should not play any track after initialization, () - {expect(player.isPlaying()).toBeFalsy();});});}
} 如果我们暂时假设describebeforeEachit和Expect是采用适当参数的静态导入方法则至少可以编译。 但是我们应该如何进行这种测试 出于兴趣我尝试将其与JUnit集成在一起结果发现这实际上非常简单我将在以后进行介绍。 到目前为止结果是一个名为Oleaster的小型图书馆。 用Oleaster编写的测试如下所示 import static com.mscharhag.oleaster.runner.StaticRunnerSupport.*;
...RunWith(OleasterRunner.class)
public class AudioPlayerTest {private AudioPlayer player;{describe(AudioPlayer tests, () - {beforeEach(() - {player new AudioPlayer();});it(should not play any track after initialization, () - {assertFalse(player.isPlaying());});});}
} 与前面的示例相比只有几处发生了变化。 在这里测试类使用JUnit RunWith注释进行注释。 这告诉JUnit在运行此测试类时使用Oleaster。 通过静态导入StaticRunnerSupport。*可以直接访问静态Oleaster方法例如describe或it。 还要注意构造函数已由实例初始化程序替换而Jasmine like matcher被标准JUnit断言替换。 与原始的Jasmine测试相比实际上有一件事情并不那么出色。 事实是在Java中变量需要有效地最终确定才能在lambda表达式中使用。 这意味着以下代码段不会编译 describe(AudioPlayer tests, () - {AudioPlayer player;beforeEach(() - {player new AudioPlayer();});...
}); 在beforeEachlambda表达式内对玩家的赋值将不会编译因为玩家实际上不是最终的。 在Java中我们必须在这种情况下使用实例字段如上例所示。 万一您担心要报告Oleaster仅负责收集和运行测试用例。 整个报告仍由JUnit完成。 因此Oleaster应该不会对使用JUnit报告的工具和库造成任何问题。 例如以下屏幕截图显示了IntelliJ IDEA中Oleaster测试失败的结果 如果您想知道Oleaster测试在实践中的外观您可以看看Oleaster的测试用Oleaster本身编写。 您可以在此处找到GitHub测试目录。 通过评论此帖子或创建GitHub问题随时添加任何类型的反馈。 翻译自: https://www.javacodegeeks.com/2014/07/an-alternative-approach-of-writing-junit-tests-the-jasmine-way.html编写junit 测试