上篇我们说到如何从Github上clone出一个JBehave项目,既是为了学习JBehava,也是为了熟悉下Github
从clone下来的项目看来,基本没什么问题,稍微捋一捋就可以运行,但是就clone下来的代码来看,自己还是遇到一个问题(不知道是代码问题,还是我自己的操作有问题),就是没有办法运行(后面会详说)。
正如上篇所说,构建一个JBehave的应用的5大步骤:

  1. Write story
  2. Map steps to Java
  3. Configure Stories
  4. Run Stories
  5. View Reports

这里,我们结合clone下来的项目分别对应这五个步骤了解JBehave是如何运行的并完成测试的。
1.Write story,设定一个story,给出一个情景,使用通用语言进行表示,不管是开发或是非开发的都能看懂
本项目有两个测试案例,一个是模拟登录的story:

  1. loginYahoo.story
  2. Narrative:
  3.  
  4. In order to show the yahoo function
  5. As a user
  6. I want to login yahoo
  7.  
  8. Scenario: normal login
  9.  
  10. Given yahoo login address by.bouncer.login.yahoo.com
  11. Then print successful

  

另一个是模拟浏览的story:

  1. TestStroies.story
  2. Browse Etsy.com
  3.  
  4. Meta:
  5. @category browsing
  6. @color red
  7.  
  8. Narrative:
  9.  
  10. In order to show the browsing cart functionality
  11. As a user
  12. I want to browse in a gallery
  13.  
  14. Scenario: Browsing around the site for items
  15.  
  16. Given I am on localhost
  17. Then print hello world
  18.  
  19. !--Examples:
  20. !--|host|hello|
  21. !--|localhost|hello world|
  22. !--|www.baidu.com|hello baidu|

  

2.Map steps to Java, 将上述的每个story细分成每一个step,给出Given条件,则会得到Then的结果,从而将通用语言转换成可以通过代码逻辑描述的问题
loginYahoo.story对应的steps类TestLogin.java:

  1. public class TestLogin {
  2. @Given("yahoo login address $url")
  3. public void getHostPage(String url){
  4. System.out.println("++++++++++++++++++++++++++++++"+url);
  5. }
  6.  
  7. @Then("print $successful")
  8. public void hello(String successful){
  9. System.out.println("++++++++++++++++++++++++++++++"+successful);
  10. }
  11. }

  

TestStories.story对应的steps类TestStep.java:

  1. public class TestStep {
  2. @Given("I am on $host")
  3. public void getHostPage(String host){
  4. System.out.println("----------------------"+host);
  5. }
  6.  
  7. @Then("print $hello")
  8. public void hello(String hello){
  9. System.out.println("----------------------"+hello);
  10. }
  11. }

  

3.Configure Stories 配置一些映射关系,比如如何找到并加载story文件等

  1. public class EmbedderBase extends Embedder{
  2.  
  3. @Override
  4. public EmbedderControls embedderControls() {
  5. return new EmbedderControls().doIgnoreFailureInStories(true).doIgnoreFailureInView(true);
  6. }
  7.  
  8. @Override
  9. public Configuration configuration() {
  10. Class<? extends EmbedderBase> embedderClass = this.getClass();
  11. //MostUsefulConfiguration使用默认的配置
  12. return new MostUsefulConfiguration()
  13. //设置story文件的加载路径
  14. .useStoryLoader(new LoadFromClasspath(embedderClass.getClassLoader()))
  15. //设定生成报告的相关配置
  16. .useStoryReporterBuilder(new StoryReporterBuilder()
  17. .withCodeLocation(CodeLocations.codeLocationFromClass(embedderClass))
  18. .withFormats(Format.CONSOLE, Format.TXT)
  19. .withCrossReference(new CrossReference()))
  20. //设定相关参数的转换
  21. .useParameterConverters(new ParameterConverters()
  22. .addConverters(new DateConverter(new SimpleDateFormat("yyyy-MM-dd")))) // use custom date pattern
  23. .useStepMonitor(new SilentStepMonitor());
  24. }
  25. }

  

4.Run Stories

  1. public class TraderStoryRunner {
  2. @Test(groups={"test"})
  3. public void runClasspathLoadedStoriesAsJUnit() {
  4. // Embedder defines the configuration and candidate steps
  5. Embedder embedder = new TestStories();
  6. List<String> storyPaths = new StoryFinder().findPaths(CodeLocations.codeLocationFromClass(this.getClass()),"**/TestStories.story",""); // use StoryFinder to look up paths
  7. embedder.runStoriesAsPaths(storyPaths);
  8. }
  9. @Test(groups={"test"})
  10. public void runClasspathLoadedStories() {
  11. // Embedder defines the configuration and candidate steps
  12. Embedder embedder = new loginYahoo();
  13. List<String> storyPaths = new StoryFinder().findPaths(CodeLocations.codeLocationFromClass(this.getClass()),"**/loginYahoo.story",""); // use StoryFinder to look up paths
  14. embedder.runStoriesAsPaths(storyPaths);
  15. }
  16. }

  

这里可以看出,声明了两个类TestStories和loginYahoo。
TestStories.java

  1. public class TestStories extends EmbedderBase {
  2.  
  3. @Override
  4. public InjectableStepsFactory stepsFactory() {
  5. return new InstanceStepsFactory(configuration(), new TestStep());//设定需要映射的step类
  6. }
  7.  
  8. }

  

loginYahoo.java:

  1. public class loginYahoo extends EmbedderBase {
  2.  
  3. @Override
  4. public InjectableStepsFactory stepsFactory() {
  5. return new InstanceStepsFactory(configuration(), new TestLogin());//设定需要映射的step类
  6. }
  7.  
  8. }

  

这两个类是一个桥梁的作用,用于设定从story到step的映射,注意这里的两个类是继承类EmbedderBase的,而EmbedderBase类又是Embedder的子类

这是项目给出的测试类TraderStoryRunner,但是这里有一个问题,就是没有找到运行的入口,点击右键,除了一些maven的操作,并没有其他可以运行的指标,比如junit。
所以通过摸索,按照自己的方法,发现首先要做的就是添加junit测试库,这是必须的。具体步骤:
右键项目->Build path->Configured build path

打开对话框,选择Libraries->Add Library->JUnit,点击next,选择junit4->finished。

添加完Junit后,新建一个Junit测试类

将TraderStoryRunner类的主体方法放进去,命名为Tc.java

  1. import static org.junit.Assert.*;
  2. import java.util.List;
  3. import org.jbehave.core.embedder.Embedder;
  4. import org.jbehave.core.io.CodeLocations;
  5. import org.jbehave.core.io.StoryFinder;
  6. import org.junit.After;
  7. import org.junit.AfterClass;
  8. import org.junit.Before;
  9. import org.junit.BeforeClass;
  10. import org.junit.Test;
  11.  
  12. import com.story.TestStories;
  13. import com.story.loginYahoo;
  14. public class Tc {
  15. @BeforeClass
  16. public static void setUpBeforeClass() throws Exception {
  17. }
  18. @AfterClass
  19. public static void tearDownAfterClass() throws Exception {
  20. }
  21. @Before
  22. public void setUp() throws Exception {
  23. }
  24. @After
  25. public void tearDown() throws Exception {
  26. }
  27.  
  28. // @Test : 表示这是一个测试用例,只有标识了改符号的函数才会被执行测试
  29.  
  30. @Test
  31. public void runClasspathLoadedStoriesAsJUnit() {
  32. // Embedder defines the configuration and candidate steps
  33. Embedder embedder = new TestStories();
  34. List<String> storyPaths = new StoryFinder().findPaths(CodeLocations.codeLocationFromClass(this.getClass()),"**/TestStories.story",""); // use StoryFinder to look up paths
  35. embedder.runStoriesAsPaths(storyPaths);
  36. }
  37. @Test
  38. public void runClasspathLoadedStories() {
  39. // Embedder defines the configuration and candidate steps
  40. Embedder embedder = new loginYahoo();
  41. List<String> storyPaths = new StoryFinder().findPaths(CodeLocations.codeLocationFromClass(this.getClass()),"**/loginYahoo.story",""); // use StoryFinder to look up paths
  42. embedder.runStoriesAsPaths(storyPaths);
  43. }
  44. }

至此,这个项目是可以运行起来了。

5.View Reports
点击运行上面的Tc.java类,可以得到:

  1. Processing system properties {}
  2. Using controls EmbedderControls[batch=false,skip=false,generateViewAfterStories=true,ignoreFailureInStories=false,ignoreFailureInView=false,verboseFailures=false,verboseFiltering=false,storyTimeoutInSecs=300,threads=1]
  3.  
  4. (BeforeStories)
  5.  
  6. Running story com/story/TestStories.story
  7. Narrative:
  8. In order to show the browsing cart functionality
  9. As a user
  10. I want to browse in a gallery
  11. Browse Etsy.com
  12. (com/story/TestStories.story)
  13. Meta:
  14. @category browsing
  15. @color red
  16.  
  17. Scenario: Browsing around the site for items
  18. ----------------------localhost
  19. Given I am on localhost
  20. ----------------------hello world
  21.  
  22. !--Examples:
  23. !--|host|hello|
  24. !--|localhost|hello world|
  25. !--|www.baidu.com|hello baidu|
  26. Then print hello world
  27.  
  28. !--Examples:
  29. !--|host|hello|
  30. !--|localhost|hello world|
  31. !--|www.baidu.com|hello baidu|
  32.  
  33. (AfterStories)
  34.  
  35. Generating reports view to 'C:\Program Files (x86)\Git\Jbehave\TestBehave_v2_testng\target\jbehave' using formats '[console, txt]' and view properties '{defaultFormats=stats, decorateNonHtml=true, viewDirectory=view, decorated=ftl/jbehave-report-decorated.ftl, reports=ftl/jbehave-reports-with-totals.ftl, maps=ftl/jbehave-maps.ftl, navigator=ftl/jbehave-navigator.ftl, views=ftl/jbehave-views.ftl, nonDecorated=ftl/jbehave-report-non-decorated.ftl}'
  36. Reports view generated with 0 stories (of which 0 pending) containing 0 scenarios (of which 0 pending)
  37. Processing system properties {}
  38. Using controls EmbedderControls[batch=false,skip=false,generateViewAfterStories=true,ignoreFailureInStories=false,ignoreFailureInView=false,verboseFailures=false,verboseFiltering=false,storyTimeoutInSecs=300,threads=1]
  39.  
  40. (BeforeStories)
  41.  
  42. Running story com/story/loginYahoo.story
  43. Narrative:
  44. In order to show the yahoo function
  45. As a user
  46. I want to login yahoo
  47.  
  48. (com/story/loginYahoo.story)
  49. Scenario: normal login
  50. ++++++++++++++++++++++++++++++by.bouncer.login.yahoo.com
  51. Given yahoo login address by.bouncer.login.yahoo.com
  52. ++++++++++++++++++++++++++++++successful
  53. Then print successful
  54.  
  55. (AfterStories)
  56.  
  57. Generating reports view to 'C:\Program Files (x86)\Git\Jbehave\TestBehave_v2_testng\target\jbehave' using formats '[console, txt]' and view properties '{defaultFormats=stats, decorateNonHtml=true, viewDirectory=view, decorated=ftl/jbehave-report-decorated.ftl, reports=ftl/jbehave-reports-with-totals.ftl, maps=ftl/jbehave-maps.ftl, navigator=ftl/jbehave-navigator.ftl, views=ftl/jbehave-views.ftl, nonDecorated=ftl/jbehave-report-non-decorated.ftl}'
  58. Reports view generated with 0 stories (of which 0 pending) containing 0 scenarios (of which 0 pending)

 大体的思路,是将story和step对应起来,将story中的条件、参数传入step对应的类中,如果满足则通过测试,得到then给出的结果,否则得不到理想的结果。

  如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!如果您想持续关注我的文章,请扫描二维码,关注JackieZheng的微信公众号,我会将我的文章推送给您,并和您一起分享我日常阅读过的优质文章。

  1.   

友情赞助

如果你觉得博主的文章对你那么一点小帮助,恰巧你又有想打赏博主的小冲动,那么事不宜迟,赶紧扫一扫,小额地赞助下,攒个奶粉钱,也是让博主有动力继续努力,写出更好的文章^^。

    1. 支付宝                          2. 微信

                      

开发人员看测试之细说JBehave的更多相关文章

  1. 开发人员看测试之TDD和BDD

    前言: 已经数月没有来园子了,写博客贵在坚持,一旦松懈了,断掉了,就很难再拾起来.但是每每看到自己博客里的博文的浏览量每天都在增加,都在无形当中给了我继续写博客的动力.最近这两天有听到Jbehave这 ...

  2. 开发人员看测试之运行Github中的JBehave项目

    本文要阐述的主要有两点,一是介绍自动化测试框架JBehave,二是介绍如何在Github上拉项目,编译成myeclipse环境中的项目,并最终导入Myeclipse中运行. JBehave是何物? J ...

  3. 写给Android App开发人员看的Android底层知识(1)

    这个系列的文章一共8篇,我酝酿了很多年,参考了很多资源,查看了很多源码,直到今天把它写出来,也是战战兢兢,生怕什么地方写错了,贻笑大方. (一)引言 早在我还是Android菜鸟的时候,有很多技术我都 ...

  4. 写给Android App开发人员看的Android底层知识(2)

    (五)AMS 如果站在四大组件的角度来看,AMS就是Binder中的Server. AMS全称是ActivityManagerService,看字面意思是管理Activity的,但其实四大组件都归它管 ...

  5. 写给Android App开发人员看的Android底层知识(5)

    (十)Service Service有两套流程,一套是启动流程,另一套是绑定流程.我们做App开发的同学都应该知道. 1)在新进程启动Service 我们先看Service启动过程,假设要启动的Ser ...

  6. 写给Android App开发人员看的Android底层知识(3)

    (七)App启动流程第2篇 书接上文,App启动一共有七个阶段,上篇文章篇幅所限,我们只看了第一阶段,接下来讲剩余的六个阶段,仍然是拿斗鱼App举例子. 简单回顾一下第一阶段的流程,就是Launche ...

  7. 写给Android App开发人员看的Android底层知识(6)

    (十一)BroadcastReceiver BroadcastReceiver,也就是广播,简称Receiver. 很多App开发人员表示,从来没用过Receiver.其实吧,对于音乐播放类App,用 ...

  8. 写给Android App开发人员看的Android底层知识(7)

    (十二)ContentProvider (1)ContentProvider是什么? ContentProvider,简称CP. 做App开发的同学,尤其是电商类App,对CP并不熟悉,对这个概念的最 ...

  9. 写给Web开发人员看的Nginx介绍

    译者注:不知道其他开发者是否和我一样,参与或者写了很多Web项目,但是却没有真正的去完整的部署应用,很多时候都是交给ops即运维的同学帮忙来做.而作为一个有节操的开发者,我认为了解一些服务器方面的知识 ...

随机推荐

  1. 百度地图api(摘自百度)

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  2. poj 1286&&poj2409 Polya计数 颜色匹配

    #include <iostream> #include <math.h> using namespace std; #define LL long long LL gcd(L ...

  3. Mac环境下svn的使用

    在Windows环境中,我们一般使用TortoiseSVN来搭建svn环境.在Mac环境下,由于Mac自带了svn的服务器端和客户端功能,所以我们可以在不装任何第三方软件的前提下使用svn功能,不过还 ...

  4. JDBC数据类型

    JDBC数据类型 JDBC驱动程序Java数据类型转换到适当的JDBC类型然后再将它发送到数据库.它使用默认的大多数数据类型映射.例如,一个Java int转换成一个SQL INTEGER.创建默认映 ...

  5. 【腾讯Bugly干货分享】浅谈Android自定义锁屏页的发车姿势

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57875330c9da73584b025873 一.为什么需要自定义锁屏页 锁屏 ...

  6. Javascript aop(面向切面编程)之around(环绕)

    Aop又叫面向切面编程,其中“通知”是切面的具体实现,分为before(前置通知).after(后置通知).around(环绕通知),用过spring的同学肯定对它非常熟悉,而在js中,AOP是一个被 ...

  7. angular ng-model类型格式转化

    在angular开发中我们经常会遇见输入框中的string的值,却想在scope上的model表现为整型.浮点.货币,或者在radio的value是一个true,false的Boolean类型,一组c ...

  8. 谈谈对BPM的理解

    BPM的产生缘由 近年来,随着计算机技术的发展和互联网时代的到来,我们已经进入了信息时代,也称为数字化时代,在这数字化的时代里,企业的经营管理都受到了极大的挑战.从上世纪90年代起至今,企业的信息化工 ...

  9. mysql --prompt

    mysql --prompt修改命令行链接mysql时的提示符,shell脚本示例如下 #!/bin/bash in crm) cmd='mysql -h192.168.1.2 -uroot -pro ...

  10. 使用oracle的大数据工具ODCH访问HDFS数据文件

    软件下载 Oracle Big Data Connectors:ODCH 下载地址: http://www.oracle.com/technetwork/bdc/big-data-connectors ...