JBehave

JBehave

上篇我们说到如何从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

2

3

4

5

6

7

8

9

10

11

loginYahoo.story:

Narrative:

In order to show the yahoo function

As a user

I want to login yahoo

Scenario: normal login

Given yahoo login address by.bouncer.login.yahoo.com

Then print successful

  

另一个是模拟浏览的story:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

TestStroies.story:

Browse Etsy.com

Meta:

@category browsing

@color red

Narrative:

In order to show the browsing cart functionality

As a user

I want to browse in a gallery

Scenario: Browsing around the site for items

Given I am on localhost

Then print hello world

!--Examples:

!--|host|hello|

!--|localhost|hello world|

!--|www.baidu.com|hello baidu|

  

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


1

2

3

4

5

6

7

8

9

10

11

public class TestLogin {

        @Given("yahoo login address $url")

        public void getHostPage(String url){

            System.out.println("++++++++++++++++++++++++++++++"+url);

        }

        @Then("print $successful")

        public void hello(String successful){

            System.out.println("++++++++++++++++++++++++++++++"+successful);

        }

}

  

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


1

2

3

4

5

6

7

8

9

10

11

public class TestStep {

    @Given("I am on $host")

    public void getHostPage(String host){

        System.out.println("----------------------"+host);

    }

    @Then("print $hello")

    public void hello(String hello){

        System.out.println("----------------------"+hello);

    }

}

  

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


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

public class EmbedderBase extends Embedder{

    @Override

    public EmbedderControls embedderControls() {

        return new EmbedderControls().doIgnoreFailureInStories(true).doIgnoreFailureInView(true);

    }

 

    @Override

    public  Configuration configuration() {

        Class<? extends EmbedderBase> embedderClass = this.getClass();

      //MostUsefulConfiguration使用默认的配置

        return new MostUsefulConfiguration()

            //设置story文件的加载路径

            .useStoryLoader(new LoadFromClasspath(embedderClass.getClassLoader()))

            //设定生成报告的相关配置

            .useStoryReporterBuilder(new StoryReporterBuilder()

                .withCodeLocation(CodeLocations.codeLocationFromClass(embedderClass))

                .withFormats(Format.CONSOLE, Format.TXT)

                .withCrossReference(new CrossReference()))

             //设定相关参数的转换

            .useParameterConverters(new ParameterConverters()

                    .addConverters(new DateConverter(new SimpleDateFormat("yyyy-MM-dd")))) // use custom date pattern

            .useStepMonitor(new SilentStepMonitor());                             

    }

}

  

4.Run Stories


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

public class TraderStoryRunner {

    @Test(groups={"test"})

    public void runClasspathLoadedStoriesAsJUnit() {

        // Embedder defines the configuration and candidate steps

        Embedder embedder = new TestStories();

        List<String> storyPaths = new StoryFinder().findPaths(CodeLocations.codeLocationFromClass(this.getClass()),"**/TestStories.story",""); // use StoryFinder to look up paths

        embedder.runStoriesAsPaths(storyPaths);

    }

    @Test(groups={"test"})

    public void runClasspathLoadedStories() {

        // Embedder defines the configuration and candidate steps

        Embedder embedder = new loginYahoo();

        List<String> storyPaths = new StoryFinder().findPaths(CodeLocations.codeLocationFromClass(this.getClass()),"**/loginYahoo.story",""); // use StoryFinder to look up paths

        embedder.runStoriesAsPaths(storyPaths);

    }

}

  

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


1

2

3

4

5

6

7

8

public class TestStories extends EmbedderBase {

    @Override

    public InjectableStepsFactory stepsFactory() {

        return new InstanceStepsFactory(configuration(), new TestStep());//设定需要映射的step类

    }

 

}

  

loginYahoo.java:


1

2

3

4

5

6

7

8

public class loginYahoo extends EmbedderBase {

 

    @Override

    public InjectableStepsFactory stepsFactory() {

        return new InstanceStepsFactory(configuration(), new TestLogin());//设定需要映射的step类

    }

 

}

  

这两个类是一个桥梁的作用,用于设定从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

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

import static org.junit.Assert.*;

import java.util.List;

import org.jbehave.core.embedder.Embedder;

import org.jbehave.core.io.CodeLocations;

import org.jbehave.core.io.StoryFinder;

import org.junit.After;

import org.junit.AfterClass;

import org.junit.Before;

import org.junit.BeforeClass;

import org.junit.Test;

import com.story.TestStories;

import com.story.loginYahoo;

public class Tc {

 @BeforeClass

 public static void setUpBeforeClass() throws Exception {

 }

 @AfterClass

 public static void tearDownAfterClass() throws Exception {

 }

 @Before

 public void setUp() throws Exception {

 }

 @After

 public void tearDown() throws Exception {

 }

 

 // @Test : 表示这是一个测试用例,只有标识了改符号的函数才会被执行测试

 @Test

 public void runClasspathLoadedStoriesAsJUnit() {

     // Embedder defines the configuration and candidate steps

     Embedder embedder = new TestStories();

     List<String> storyPaths = new StoryFinder().findPaths(CodeLocations.codeLocationFromClass(this.getClass()),"**/TestStories.story",""); // use StoryFinder to look up paths

     embedder.runStoriesAsPaths(storyPaths);

 }

    @Test

 public void runClasspathLoadedStories() {

     // Embedder defines the configuration and candidate steps

     Embedder embedder = new loginYahoo();

     List<String> storyPaths = new StoryFinder().findPaths(CodeLocations.codeLocationFromClass(this.getClass()),"**/loginYahoo.story",""); // use StoryFinder to look up paths

     embedder.runStoriesAsPaths(storyPaths);

 }

}

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

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


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

Processing system properties {}

Using controls EmbedderControls[batch=false,skip=false,generateViewAfterStories=true,ignoreFailureInStories=false,ignoreFailureInView=false,verboseFailures=false,verboseFiltering=false,storyTimeoutInSecs=300,threads=1]

(BeforeStories)

Running story com/story/TestStories.story

Narrative:

In order to show the browsing cart functionality

As a user

I want to browse in a gallery

Browse Etsy.com

(com/story/TestStories.story)

Meta:

@category browsing

@color red

Scenario: Browsing around the site for items

----------------------localhost

Given I am on localhost

----------------------hello world

!--Examples:

!--|host|hello|

!--|localhost|hello world|

!--|www.baidu.com|hello baidu|

Then print hello world

!--Examples:

!--|host|hello|

!--|localhost|hello world|

!--|www.baidu.com|hello baidu|

(AfterStories)

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}‘

Reports view generated with 0 stories (of which 0 pending) containing 0 scenarios (of which 0 pending)

Processing system properties {}

Using controls EmbedderControls[batch=false,skip=false,generateViewAfterStories=true,ignoreFailureInStories=false,ignoreFailureInView=false,verboseFailures=false,verboseFiltering=false,storyTimeoutInSecs=300,threads=1]

(BeforeStories)

Running story com/story/loginYahoo.story

Narrative:

In order to show the yahoo function

As a user

I want to login yahoo

(com/story/loginYahoo.story)

Scenario: normal login

++++++++++++++++++++++++++++++by.bouncer.login.yahoo.com

Given yahoo login address by.bouncer.login.yahoo.com

++++++++++++++++++++++++++++++successful

Then print successful

(AfterStories)

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}‘

Reports view generated with 0 stories (of which 0 pending) containing 0 scenarios (of which 0 pending)

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

时间: 2024-10-10 01:07:00

JBehave的相关文章

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

本文要阐述的主要有两点,一是介绍自动化测试框架JBehave,二是介绍如何在Github上拉项目,编译成myeclipse环境中的项目,并最终导入Myeclipse中运行. JBehave是何物? JBehave是基于BDD框架的开源自动化测试框架.提供Web集成的BDD层扩展. JBehave特征: JBehave是纯Java实现,可以利用Java丰富的API为己所用: 具有基于文本的story,可以对其进行定义并执行,比较灵活和易扩展: 基于注解(Annotation)的运行配置信息,指定s

开发人员看测试之细说JBehave

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

JBehave and Cucumber的区别

JBehave and Cucumber are completely different frameworks, although meant for the same purpose: acceptance tests. They are based around stories (JBehave) or features (Cucumber). A feature is a collection of stories, expressed from the point of view of

《敏捷软件测试》的读书笔记(三)

第三部分 敏捷测试象限 6. 测试的目的 敏捷测试的象限 支持团队的测试:帮助开发开发产品 象限一:TDD/TD测试.使用和应用相同的编码.一般内部质量由程序员定义.参与测试.CI环境. 象限二:测试每个产品的细节,自动化测试运行于业务逻辑层.自动化持续集成.构建.测试过程.快速测试,反馈BUG.功能环境 支持产品的测试:确认产品满足需求,改进产品.测试 象限三:评价产品满足客户需求.竞争力,改进产品.仿真最终用户测试. 象限四:性能安全开发的每一步都应考虑,不要留到最后. 知道一个产品何时完成

移动APP自动化测试框架

简介 移动APP的UI自动化测试长久以来一直是一个难点,难点在于UI的"变", 变化导致自动化用例的大量维护.从分层测试的角度,自动化测试应该逐层进行.最大量实现自动化测试的应该是单元测试,最容易实现也最容易在早期发现问题:其次是接口级测试,以验证逻辑为目的进行自动化,由于接口的相对稳定,自动化测试成本相对也可以接受:自动化成本最大的便是UI级自动化测试,然而UI界面是直接反馈给用户的效果展示,适度的尤其是BVT级的自动化测试也是非常必要的.本文通过分析几种自动化框架的异同,使测试人员

U3D外包公司:Ruby的未来

那是一段醉人的日子.元素数据编程,动态类型,Ruby和Rails组合而带来的约定优于配置(Convention Over Configuration)的模式,给了我们更加快速的开发和更简洁的代码.已经内置到语言中的测试驱动原则.整个社区提供给大家了很多写的很好的,经过验证过的代码.行为驱动开发(BDD)——在Java中垂死挣扎(有谁在用JBehave?)——在Ruby中出现并兴旺发展:Rspec是最早的成功案例,接着是Cucumber.如今,这最好的Ruby同样也是最好的Agile/XP展示厅,

Cucumber(一): Preparation

Every time I wrote some code in ruby and executed our cucumber features I craved for something similar in Java. I knew that there were several BDD frameworks for Java like JBehave, JDave, and EasyB, but none of them was right for me: either it used a

Android开发免费类库和工具集合

Android开发免费类库和工具集合 - OPEN 开发经验库 用于Android开发的免费类库和工具集合,按目录分类. Action Bars ActionBarSherlock Extended ActionBar FadingActionBar GlassActionBar v7 appcompat library 广告 AdMob Google Mobile Ads SDK InMobi mMedia mobileCore MoPub Tapjoy Analytics Google An

醒醒吧少年,只用Cucumber不能帮助你BDD

转载:http://insights.thoughtworkers.org/bdd/ 引言 在Ruby社区中,测试和BDD一直是被热议的话题,不管是单元测试.集成测试还是功能测试,你总能找到能帮助你的工具,Cucumber就是被广泛使用的工具之一.许多团队选择Cucumber的原因是"团队要BDD",也就是行为驱动开发(Behavior Driven Development),难道用了Cucumber之后团队就真的BDD了么? 事情当然没这么简单了,BDD作为一种软件开发方法论,一定要