zoukankan      html  css  js  c++  java
  • 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)GitJbehaveTestBehave_v2_testng argetjbehave' 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)GitJbehaveTestBehave_v2_testng argetjbehave' 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给出的结果,否则得不到理想的结果。

  • 相关阅读:
    华为设备SNMP配置
    Linux CP直接覆盖快速操作
    CentOS7快速安装PHP7.0指南
    Linux SSH免密码登录配置
    this的指向
    分页的模块layui
    multer中间件
    ajax实现图片上传
    MVC模式、加密、jsonwebtoken
    mongoose与express
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/4811730.html
Copyright © 2011-2022 走看看