首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Cucumber BDD在不同类之间共享变量

基础概念

Cucumber 是一个行为驱动开发(BDD)工具,它允许开发者通过自然语言描述应用程序的行为。BDD 强调的是从业务的角度出发,通过编写可执行的规范来描述系统的行为。

共享变量的问题

在 Cucumber 中,测试场景通常分布在不同的步骤定义(Step Definitions)中,这些步骤定义可能位于不同的类文件中。由于每个测试场景的执行是独立的,因此在不同类之间共享变量可能会遇到一些问题:

  1. 线程安全:Cucumber 默认使用多线程执行测试,不同线程间的变量共享可能会导致数据不一致或竞争条件。
  2. 可维护性:全局变量会增加代码的复杂性,使得代码难以维护和理解。
  3. 测试隔离:每个测试场景应该独立运行,共享变量可能会破坏这种隔离性。

解决方案

1. 使用上下文对象(Context Object)

创建一个上下文对象来存储需要在不同步骤定义之间共享的数据。

代码语言:txt
复制
public class TestContext {
    private String sharedVariable;

    public String getSharedVariable() {
        return sharedVariable;
    }

    public void setSharedVariable(String sharedVariable) {
        this.sharedVariable = sharedVariable;
    }
}

在步骤定义中使用这个上下文对象:

代码语言:txt
复制
public class StepDefinitions {
    private TestContext testContext;

    @Before
    public void setUp() {
        testContext = new TestContext();
    }

    @Given("a user is on the homepage")
    public void a_user_is_on_the_homepage() {
        testContext.setSharedVariable("homepage");
    }

    @When("the user clicks on the login button")
    public void the_user_clicks_on_the_login_button() {
        String currentPage = testContext.getSharedVariable();
        System.out.println("Current page: " + currentPage);
    }
}

2. 使用依赖注入

使用依赖注入框架(如 PicoContainer)来管理步骤定义之间的依赖关系。

代码语言:txt
复制
public class StepDefinitions {
    private TestContext testContext;

    public StepDefinitions(TestContext testContext) {
        this.testContext = testContext;
    }

    @Given("a user is on the homepage")
    public void a_user_is_on_the_homepage() {
        testContext.setSharedVariable("homepage");
    }

    @When("the user clicks on the login button")
    public void the_user_clicks_on_the_login_button() {
        String currentPage = testContext.getSharedVariable();
        System.out.println("Current page: " + currentPage);
    }
}

在 Cucumber 配置文件中配置依赖注入:

代码语言:txt
复制
public class CucumberOptions {
    @BeforeClass
    public static void setUp() {
        TestContext testContext = new TestContext();
        Container container = new PicoContainer();
        container.addComponent(TestContext.class, testContext);
        container.addComponent(StepDefinitions.class, StepDefinitions.class, new ParameterResolver() {
            @Override
            public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
                return parameterContext.getParameter().getType() == StepDefinitions.class;
            }

            @Override
            public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
                return container.getComponent(StepDefinitions.class);
            }
        });
    }
}

应用场景

共享变量在以下场景中可能会有用:

  1. 跨步骤的数据传递:当一个步骤的结果需要传递给下一个步骤时。
  2. 测试数据共享:当多个测试场景需要使用相同的数据时。
  3. 配置信息共享:当多个步骤需要访问相同的配置信息时。

参考链接

通过上述方法,可以在 Cucumber BDD 中有效地在不同类之间共享变量,同时保持代码的可维护性和测试的隔离性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

cmake:各级子项目(目录)之间共享变量

,但opencl与facedetect和facefeature同级目录,所以用set定义的变量无法共享,要用set(variable value CACHE INTERNAL docstring )这种方式定义的变量会把变量加入到...CMakeCache.txt然后各级目录共享会访问到这个变量 比如: opencl下的CMakeLists.txt中定义一个变量 set(ICD_LIBRARY "${PROJECT_BINARY_DIR...facedetect下的CMakeLists.txt中读取这个一个变量 MESSAGE(STATUS "ICD_LIBRARY :${ICD_LIBRARY}") 每次运行cmake都会更新这个变量...方法二 set_property/get_property: 使用set_property实现共享变量的方法,不会将变量写入CMakeCache.txt,应该是内存中实现的。...INCLUDE_OPENCL_1_2" ) //显示INCLUDE_OPENCL MESSAGE(STATUS "INCLUDE_OPENCL :${INCLUDE_OPENCL}") 上面的例子可以看出这种方式相比方法一使用变量时多了一步

1.8K40

什么是行为驱动的 Python?

无论什么情况下,了解 BDD 都可以帮助您和您的团队实现更好的协作和测试自动化,而 Python 的 behave 框架是一个很好的起点。 什么是 BDD?...BDD 的核心是:使行为成为软件开发的焦点。开发早期使用示例语言的规范来定义行为。最常见的行为规范语言之一是 Gherkin,Cucumber项目中的Given-When-Then场景格式。...这是BDD的核心:使行为成为软件开发的焦点。 开发早期使用示例规范的语言来定义行为。...一个常见的最佳实践是步骤中给参数加双引号。 每个步骤定义函数还接收一个上下文变量,该变量保存当前正在运行的场景的数据,例如 feature、scenario 和 tags 字段。...也可以添加自定义字段,用于步骤之间共享数据。始终使用上下文来共享数据——永远不要使用全局变量! behave 框架还支持钩子来处理 Gherkin 步骤之外的自动化问题。

1.7K30
  • 使用CucumberAndroid中实现行为驱动开发

    通过使用人类语言,行为驱动开发(BDD)弥合了软件开发中技术人员和非技术人员之间的差距。...弥合这一差距需要一种协作方法,该方法使用自然语言来鼓励技术和非技术利益相关者之间的沟通和协作。这正是 行为驱动开发 (BDD) 的目标:开发人员、测试人员和业务利益相关者之间达成理解。...作为一名软件工程师,我一直使用最流行的工具之一 Cucumber 来实现 BDDCucumber 通过协作执行规范来帮助业务和技术团队协作。BDD 规范还兼作自动化测试。...Cucumber 等工具可帮助使用可执行规范作为自动化测试来实现 BDD,从而使团队能够创建清晰、共享的文档。...有关更多见解,请访问我的 Hechio BDD 参考项目或 cucumber/cucumber-android 项目,该项目为 Cucumber-JVM 提供 Android 支持。

    2710

    干货 | 基于 BDD 理念的 UI 自动化测试携程度假的应用

    从层次上来说,BDD 是基于 TDD 的,或者说自动化测试中,TDD 所在的位置比较底层,是基础,而 BDD 则是它的演进版本。 ?...那有没有办法能直接使用自然语言编写,让我们的测试写一行代码,进一步降低自动化学习成本,并且还能打开真正的浏览器,去模拟用户“点点点“的行为呢? 答案自然是:有的!...,只需要组合,使用者不需要关心具体实现 现在我们来回看下面这张图: 1)我们 Cucumber Hooks 中定义了相关钩子函数,把打开浏览器等每个测试用例需要做的通用工作给做了; 2) Cucumber...或在 GitLab CI 环境变量中设置 CUCUMBER_PARALLEL=true 启用并行模式 CUCUMBER_TOTAL_SLAVES=10 使用 10 个进程...并不是这样的, APP 端 (Native 或 CRN)我们通用可以使用同一套命令,使用 Cucumber 结合 AirTest 进行 APP 侧的 BDD 自动化测试。

    2.6K21

    Cucumber入门 - 啥是BDD

    然而,Cucumber的首页清楚地写着“making BDD fun”,即让行为驱动开发充满欢乐。行为驱动开发(BDD)是什么?Cucumber的开发者为什么又要给它扣上这个帽子呢?...理想中的BDD开发,是这样的:周一早晨上班时,团队成员一起书写一个或几个用户行为,并为每个行为估算工作量。从中选出可以一周内完成的部分,以作为本周目标开始工作。...、以拉力驱动、高度自动化的敏捷方法 BDD的实践,需要用户、开发人员和测试人员共同努力 BDD中的行为,可以整合传统流程中的诸多文档与代码;可以减少为维护文档而造成的浪费; Cucumber中,行为(...因此,我喜欢BDD,但不推荐它、试图推广。但是,如果抛开BDD,只是把Cucumber当做一个自动化测试工具,不改变现有流程的情况下,去用,去体会,去思考。...渐渐地,一个组或一个项目便可以慢慢地减少浪费,增加自动化,更短时间提供更多的可交付的产品。甚至于,不知不觉地转型成BDD。这就是我喜欢cucumber,推荐、也试图推广它的原因。

    1.3K10

    行为驱动开发:一篇文章带你用 Python 玩转 BDD

    BDD 及优势 BDD,行为驱动开发是 敏捷软件开发 的一种技术,鼓励软件项目的所有成员之间的相互协助 传统的软件开发方式主要缺点包含:测试用例比较单一,导致覆盖率不高;业务和产品不能够全面了解产品的行为表现...BDD 的出现主要优势有下面 2 点,主要体现在: 可以很好的减少项目成员之间的沟通成本,增加协作 BDD 能够将上线之后的手工测试转换为自动化测试,提升测试效率 2....Gherkin 语言及 Features Gherkin 是 BDD 框架 Cucumber 的功能性语言,能够通过自然语言,支持多国语言,描述一个具体的需求 Gherkin 语言使用的是主要英文关键词包含...step_impl(context, title):     assert context.driver.title == title 需要指出的是,方法名中的第一个参数 context 是一个全局的字典,可以步骤方法之间传递数据...测试报告 为了保证下一步 Jenkins 中能正常显示测试报告,需要将 behave 生成的测试报告转换为 cucumber 兼容的 json 测试报告 首先,安装依赖 behave2cucumber

    3K00

    行为驱动开发:一篇文章带你用 Python 玩转 BDD

    BDD 及优势 BDD,行为驱动开发是 敏捷软件开发 的一种技术,鼓励软件项目的所有成员之间的相互协助 传统的软件开发方式主要缺点包含:测试用例比较单一,导致覆盖率不高;业务和产品不能够全面了解产品的行为表现...BDD 的出现主要优势有下面 2 点,主要体现在: 可以很好的减少项目成员之间的沟通成本,增加协作 BDD 能够将上线之后的手工测试转换为自动化测试,提升测试效率 2....Gherkin 语言及 Features Gherkin 是 BDD 框架 Cucumber 的功能性语言,能够通过自然语言,支持多国语言,描述一个具体的需求 Gherkin 语言使用的是主要英文关键词包含...step_impl(context, title): assert context.driver.title == title 需要指出的是,方法名中的第一个参数 context 是一个全局的字典,可以步骤方法之间传递数据...测试报告 为了保证下一步 Jenkins 中能正常显示测试报告,需要将 behave 生成的测试报告转换为 cucumber 兼容的 json 测试报告 首先,安装依赖 behave2cucumber

    1.7K20

    干货 | 行为驱动开发在携程机票前端研发流程中的实践

    机票预订研发流程中 BDD(行为驱动开发)模式的引入,统一了技术人员和非技术人员对软件行为描述的语言,均衡了自动化测试与手工测试之间的关系;入门级中文编程易读易用,且支持细颗粒度用例及海量用例复用。...参考维基百科的描述: 行为驱动开发(英语:Behavior-driven development,缩写BDD)是一种敏捷软件开发的技术,它鼓励软件项目中的开发者、QA和非技术人员或商业参与者之间的协作。...这让开发者得以把精力集中代码应该怎么写,而不是技术细节上,而且也最大程度的减少了将代码编写者的技术语言与商业客户、用户、利益相关者、项目管理者等的领域语言之间来回翻译的代价。...三、BDD 改造过程 Cucumber Cucumber 是一种支持行为驱动开发的工具。...我们 Cucumber 和 Macaca 的基础上,整合出一系列通用的工具和完善的文档,取名为 MEC (macaca eating cucumber)。

    2.3K51

    3个开源行为驱动的开发工具

    事实上,根本没有结束,只是最初尝试编写行为场景之后的缓慢消退。 一个新开始 快进了一年,我另一家公司,拥有自己的团队和BDD。我知道那里有价值,但也知道它的价值比最初出售的价值还要深。...3种BDD工具可供选择 BDD的核心是一种帮助整个团队了解最终用户的行为和行为的方法,这将导致更清晰的需求,测试以及最终更高质量的应用程序。选择工具之前,请先做准备。...每个组织都有不同的角色,BDD不应仅属于开发人员,也不应该属于测试自动化工程师。如果涉及业务方面,那么永远不会获得这种方法的全部好处。...定义好策略并准备好实现BDD方案自动化后,便有几种开源工具供您选择。 Cucumber Cucumber可能是最受支持的BDD工具。它被广泛认为是一种简单易学的工具,易于上手。...Gauge 专门设计Cucumber和JBehave与BDD一起使用的地方,Gauge不是。如果自动化是主要目标(而不是整个BDD流程),那么值得一看。

    1.2K11

    醒醒吧少年,只用Cucumber不能帮助你BDD | TW洞见

    1 引言 Ruby社区中,测试和BDD一直是一个被热议的话题,不管是单元测试,集成测试和功能测试,你总能找到能帮助你的工具,Cucumber就是被广泛使用的工具之一。...许多团队选择Cucumber的原因是“团队要BDD”,也就是行为驱动开发(Behavior Driven Development),难道用了Cucumber之后团队就真的BDD了么? ?...近期Cucumber的作者Aslak也博客中提到 BDD出现的9年后,依然有不少团队使用BDD时出现问题……BDD依然经常被人误解成单纯的测试,或者是一个可以被下载的工具 同时,Aslak也吐槽了...那么问题来了,怎样日常项目中使用Cucumber呢?真的能在日常项目中进行BDD开发么?要回答这个问题,我们需要重新认识一下BDD。...5 理想很丰满,现实很骨感 任何工具和实践都有优缺点,Cucumber例外。团队开始尝试新的实践或者工具时,多多少少都会碰到一些问题,下面我们就来看看一些使用Cucumber的问题。

    95570

    cucumber测试框架

    1.1 什么是BDD(行为驱动开发)   首先了解一个概念,BDD(BehaviorDrivenDevelopment:行为驱动开发)为用户提供了从 开发人员和客户的需求创建测试脚本的机会。...1.2 Cucumber 简介   Cucumber是一个测试框架。有人说,这个框架非常适合UI自动化测试,他 仅能把用例中的测试步骤以非常友好的形式展现出来,而且能够非常灵活的构建场景。   ...Cucumber 是一个能够理解用普通语言 描述的测试用例的行为驱动开发(BDD)的自动化测试工具,用Ruby编写,支持Java和·Net等多种开发语言。   ...Cucumber可以让人们用近似自然的语言去描述Feature(什么是Feature在后面有讲述)和场景,根据Feature驱动开发。用作软件技术人员和非技术之间验收测试的桥梁。它是一个命令行工具。...组件之间的工作原理如图: ? 1.4 Features   语法规则:   基于Gherkin。Gherkin是一种简单的英语文本语言,它有助于工具–Cucumber解释和执行测试脚本。

    3.9K20

    Cucumber测试实践

    二、Cucumber测试实践 1、并不是BDD 根据维基百科,BDD是一种对于TDD敏捷软件开发中的改进尝试,主要目的在用自然语言让DEV、QA、BA、PO对于程序如何运行形成一种共同理解。...然而,我们的目的是为了将我们测试过程中的所有行为、断言利用程序记录下来,所以Cucumber是作为一种脚本工具来完成测试实践。在这个场景下我们测试的是一个已经开发完成的代码,这不是一种BDD。...使用Cucumber并不意味着使用BDD。所以不需要给Cucumber测试别扭地加上一层BDD的外衣,而是将其作为一种脚本工具来统一实现测试执行行为,形成类似一种测试行为字典。...具体可以参考:https://cucumber.io/docs/bdd/better-gherkin/和https://cucumber.io/docs/guides/overview/。...但同时也局限于此,对于很多场景来说人眼的观察是有限的,比如大量数据的比对、各种随机场景的模拟,这些脚本往往可以编写的超越人眼。

    92610

    【腾讯 TMQ 】移动 APP 自动化测试框架对比

    库仅支持使用Java,因此很难和使用Ruby的cucumber混合。如想支持BDD框架,建议使用Java自己的BDD框架,例如Jbehave。 4....Calabash开源免费并支持Cucumber语言,Cucumber能让你用自然的英语语言表述app的行为,实现BDD(Behavior Driven Development,行为驱动开发)。...支持BDD的自动化框架比较少,可以calabash 和 RoboSpock及Jbehave之间选择。 若想同时支持Android和IOS,可选框架有Appium和Calabash,或AthRun。...它允许使用Cucumber编写结构化英语句子的测试场景。 Frank要求测试时应用程序内部编译,这意味着对源代码的改变是强制性的。...操作方式为使用Cucumber和JSON组合命令,将命令发送到本地应用程序内部运行的服务器上,并利用UISpec运行命令。 优点: 测试场景是Cucumber的帮助下,用可理解的英语句子写的。

    6.5K11

    BDD与单元测试相关问题介绍

    idea中选中包路径运行整个包下的测试用例,相当于启动了若干个runner任务。 @RunWith是什么? 不同的测试工具有不同的单测规则,原理基本如上段所述。...指定@RunWith的时候会创建一个默认简单的单测构造器,然后直接去执行测试用例。@RunWith的作用是为了解决版本问题。但是有时候没有版本问题就不需要添加这个注解。...如何实现BDD 市面上比较常用的BDD框架是cucumber 。 先做一个demo尝尝鲜! 1、idea安装cucumber插件。...3、编写测试用例 4、执行单测 右键我们的feature文件 5、与spring的整合 和spring整合这块,cumuber提供了cumuber-spring的jar包。...只需要我们写代码的时候添加上注解@CucumberContextConfiguration即可。 BDD存在的问题 comuber不能mock,因为所采用的junit不是同一junit。

    89410

    BDD测试框架之Cucumber使用入门

    1 什么是Cucumber cucumber早在ruby环境下应用广泛,作为BDD框架的先驱,cucumber后来被移植到了多平台,简单来说cucumber是一个测试框架,就像是juint或是rspec...一样,不过cucumber遵循的是BDD的原则。...2 何为BDD? BDD就是行为驱动开发,是一种软件开发流程或者说是软件开发实践,具体学术化的东西这里就不介绍了,归根到底,cucumber具有让你用自然语言编写用例的能力。...对这些关键词的处理是一样的,但是我们使用的时候需要按照场景区分。...(假如 当 那么) Cucumber的步骤中会包含Given、When、then这些词组,cucumber本身在技术实现上区分这三个词组,但是使用上推荐按照词组的意思来使用。

    2.5K40

    BDD测试框架之Cucumber使用入门

    什么是Cucumber cucumber早在ruby环境下应用广泛,作为BDD框架的先驱,cucumber后来被移植到了多平台,简单来说cucumber是一个测试框架,就像是juint或是rspec一样...,不过cucumber遵循的是BDD的原则。...何为BDD? BDD就是行为驱动开发,是一种软件开发流程或者说是软件开发实践,具体学术化的东西这里就不介绍了,归根到底,cucumber具有让你用自然语言编写用例的能力。...对这些关键词的处理是一样的,但是我们使用的时候需要按照场景区分。...当 那么) Cucumber的步骤中会包含Given、When、then这些词组,cucumber本身在技术实现上区分这三个词组,但是使用上推荐按照词组的意思来使用。

    3.9K51

    移动APP自动化测试框架对比

    库仅支持使用Java,因此很难和使用Ruby的cucumber混合。如想支持BDD框架,建议使用Java自己的BDD框架,例如Jbehave。...Calabash开源免费并支持Cucumber语言,Cucumber能让你用自然的英语语言表述app的行为,实现BDD(Behavior Driven Development,行为驱动开发)。...支持BDD的自动化框架比较少,可以calabash和RoboSpock及Jbehave之间选择。...它允许使用Cucumber编写结构化英语句子的测试场景。Frank要求测试时应用程序内部编译,这意味着对源代码的改变是强制性的。...操作方式为使用Cucumber和JSON组合命令,将命令发送到本地应用程序内部运行的服务器上,并利用UISpec运行命令。 优点:测试场景是Cucumber的帮助下,用可理解的英语句子写的。

    4.1K20

    移动APP自动化测试框架对比

    库仅支持使用Java,因此很难和使用Ruby的cucumber混合。如想支持BDD框架,建议使用Java自己的BDD框架,例如Jbehave。 4....Calabash开源免费并支持Cucumber语言,Cucumber能让你用自然的英语语言表述app的行为,实现BDD(Behavior Driven Development,行为驱动开发)。...支持BDD的自动化框架比较少,可以calabash 和 RoboSpock及Jbehave之间选择。 若想同时支持Android和IOS,可选框架有Appium和Calabash,或AthRun。...它允许使用Cucumber编写结构化英语句子的测试场景。 Frank要求测试时应用程序内部编译,这意味着对源代码的改变是强制性的。...操作方式为使用Cucumber和JSON组合命令,将命令发送到本地应用程序内部运行的服务器上,并利用UISpec运行命令。 优点: 测试场景是Cucumber的帮助下,用可理解的英语句子写的。

    5.8K101

    码农,你真的了解TDD和BDD吗?

    程序员最耳熟能详的分层概念就是网络的七层模型,只要一层模型成熟了,就会有人基于这个模型做延伸的思考,这样的做法测试上也例外。...今天最流行的 BDD 框架应该是 Cucumber,它的作者就是 RSpec 的作者之一 Aslak Hellesøy。...这也就是我们前面说 BDD 测试用例更贴近业务的原因。它希望成为业务人员和技术团队之间沟通的桥梁,所以,它的表述方式更贴近于业务。...如果说 Gherkin 语言部分几乎各种 BDD 框架之间是通用的,那步骤定义部分则是框架强相关。...活文档指的是持续更新的文档,这个概念本身局限于技术领域。Cucumber 本身有对 活文档的支持,它可以与 JIRA 去集成,可以直接把 Cucumber 测试用例变成文档。

    87810

    软件测试测试开发|常见软件测试框架类型:TDD、BDD、DDD、ATDD、DevOps介绍

    对于一个业务模型及其复杂、内部模块之间的相互依赖性非常强的项目,采用TDD反而会得不尝失,这会导致程序员拆分接口和写测试代码的时候工作量非常大。...另外,由于模块之间的依赖性太强,我们写测试代码的时候可能不采取一些桥接模式来实现,这样势必加大了程序员的工作量。...常用的BDD框架有Cucumber(支持多种语言,如Java、JavaScript和Ruby)、Behave(Python)和SpecFlow(针对.NET平台)。...BDD旨在消除TDD过程中可能造成的问题。与TDD相比,BDD是通过编写行为和规范来驱动软件开发。 行为和规范可能看起来与测试非常相似,但是它们之间却有着微妙但重要的区别。...FitNesse、Robot Framework和Cucumber都可以用于ATDD。注:ATDD与BDD非常相似,它们之间的主要区别是:BDD更多的是聚焦功能点的行为,而ATDD是捕获更精准的需求。

    35710
    领券