行为驱动测试(1)

行为驱动(1)
1、简介
BDD:Behavior Driven Development
本质:用中文、英文或其他语言编写测试用例,然后去执行。每一个语言通过装饰器对应到一个测试用例步骤的执行。

关键字:
(1)Feature:特性,将多个测试用例集合到一起,对应于unittest中的test suite(测试用例集)
(2)Scenario:情景,用于描述一个用例,对应于unittest中的test case(测试用例)
(3)Given:如果,用例开始执行前的一个前置条件,类似于unittest中setup方法中的一些步骤
(4)When:当,用例开始执行时的一好些关键操作步骤,类似于unittest中的以test开头的方法,比如执行一个单击元素的操作
(5)Then:那么,验证结果,就是平时用例中中验证步骤,比如assert方法
(6)And:和,一个步骤中如果存在多个Given操作,后面的Given可以用And代替
(7)But:一个步骤中如果存在多个Then操作,第二个开始后面的Then可以用But代替

2、环境准备:
(1)安装lettuce 命令行使命令:pip install lettuce 验证是否安装成功---进入python交互模式,导入lettuce:import lettuce
(2)导入时出现警报:安装python-Levenshtein pip install python-Levenshtein
(3)安装python-Levenshtein时报错,需要安装VCForPython27.msi(Visual C++环境)

3、第一个英文语言行为驱动测试
测试逻辑:
(1)从lettuce全局变量命名空间world中取得一个整数
(2)计算该整数的阶乘
(3)断言计算结果的正确性

BDD实施步骤:
(1)Pycharm工具创建如下所示的目录结构及文件:
lettuce\MyFirstBDD\features\-zero.feature -steps.py
前两层目录lettuce和MyFirstBDD不是必需的,而且名字可以自定义;但features目录是必须存在的,并且目录名不能更改,执行行为驱动脚本时,lettuce首先寻找的就是这个名字的目录;features目录下放的是执行场景文件(扩展名为.feature的文件)和描述行为的脚本文件(扩展名为.py的文件)
(2)zero.feature用于完成lettuce工作流程的第一步,描述测试场景的行为,具体内容如下:

Feature: Compute factorial
  In order to play with Lettuce
  As beginners
  We‘ll implement factorial

  Scenario: Factorial of 0
    Given I have the number 0
    When I compute its factorial
    Then I see the number 1

  Scenario: Factorial of 1
    Given I have the number 1
    When I compute its factorial
    Then I see the number 1

  Scenario: Factorial of 2
    Given I have the number 2
    When I compute its factorial
    Then I see the number 2

  Scenario: Factorial of 3
    Given I have the number 3
    When I compute its factorial
    Then I see the number 6

(3)steps.py里面使用Python语言编写行为步骤,并且提供检测执行结果代码,具体内容如下:

#encoding=utf-8
from lettuce import *

#用于计算整数的阶乘函数
def factorial(number):
    number = int(number)
    if number == 0 or number == 1:
        return 1
    else:
        return reduce(lambda x,y: x * y,range(1,number+1))

@step("I have the number (\d+)")
def have_the_number(step,number):
    #将通过正则表达式匹配的数字在于全局变量world中
    world.number = int(number)

@step("I compute its factorial")
def compute_its_factorial(step):
    #从全局变量world中取出匹配的数字
    #计算其阶乘,并将结果再存回world中
    world.number = factorial(world.number)

@step("I see the number (\d+)")
def check_number(step,expected):
    #通过正则匹配到预期数字
    expected = int(expected)
    #断言计算阶乘结果是否等于期望
    assert world.number == expected,"Got %d" % world.number

(4)在PyCharm工具的Terminal(终端)中,将当前工作目录切换到features目录所在的目录(操作方法如同Windows的CMD),然后执行命令“lettuce”启动行为驱动测试,也可以直接在cmd中执行“lettuce”

4、通过类模式实现英文行为驱动
测试逻辑:
(1)将测试步骤封装到类中,并从全局变量中获取需要的计算阶乘的整数
(2)计算该整数的阶乘
(3)断言计算结果的正确性

BDD实施步骤:
(1)Pycharm工具创建如下所示的目录结构及文件:
lettuce\ClassBDD\features\-zero.feature -steps.py
(2)zero.feature文件具体内容如下:

Feature: Compute factorial
  In order to play with Lettuce
  As beginners
  We‘ll implement factorial

  Scenario: Factorial of 0
    Given I have the number 0
    When I compute its factorial
    Then I see the number 1

  Scenario: Factorial of 1
    Given I have the number 1
    When I compute its factorial
    Then I see the number 1

  Scenario: Factorial of 2
    Given I have the number 2
    When I compute its factorial
    Then I see the number 2

  Scenario: Factorial of 3
    Given I have the number 3
    When I compute its factorial
    Then I see the number 6

(3)steps.py文件具体内容如下:

#encoding=utf-8
from lettuce import *

def factorial(number):
    number = int(number)
    if number == 0 or number == 1:
        return 1
    else:
        return reduce(lambda x,y: x * y,range(1,number+1))
@steps
class FactorialSteps(object):
    """Methods in exclude or starting with _ will not be considered as step"""

    exclude = ["set_number",‘get_number‘]

    def __init__(self,environs):
        #初始全局变量
       self.environs = environs

    def set_number(self,value):
        #设置全局变量中的number变量的值
        self.environs.number = int(value)

    def get_number(self):
        #从全局变量中取出number的值
        return self.environs.number

    def _assert_number_is(self,expected,msg = "Got %d"):
        number = self.get_number()
        #断言
        assert number == expected,msg % number

    def have_the_number(self,step,number):
        """I have the number (\d+)"""
        #上面的三引号引起的代码必须写,并且必须是三引号引起
        #表示从场景步骤中获取需要的数据
        #并将获取的数据存到全局变量number中
        self.set_number(number)

    def i_compute_its_factorial(self,step):
        number = self.get_number()
        #调用factorial方法进行阶乘计算
        #并将结果在于全局变量中的number中
        self.set_number(factorial(number))

    def check_number(self,step,expected):
        """I see the number (\d+)"""
        #上面的三引号引起的代码必须写,并且必须是三引号引起
        #表示从场景步骤中获取需要的数据以便断言测试结果
        self._assert_number_is(int(expected))

FactorialSteps(world)

原文地址:https://www.cnblogs.com/test-chen/p/10975308.html

时间: 2024-10-10 01:39:44

行为驱动测试(1)的相关文章

Android JNI用于驱动测试

硬件平台:S3C6410 操作系统:Ubuntu.windows 板子系统:Android 开发工具:jdk,ndk,eclipse 本次测试从linux内核模块编译开始,以S3C6410的pwm驱动为例. pwm_6410.c: #include <linux/module.h> #include <linux/kernel.h> #include <linux/fs.h> #include <linux/init.h> #include <linu

selenium+python(模块化驱动测试)

模块化驱动测试,就是借鉴编程语言中模块化的思想,把重复的操作独立成功公告模块,懂用例执行过程中需要用到这一模块操作时则被调用,这样可以极大的消除重复从而提高测试用例的可维护性 下面具体以126邮箱为例: 首先对每次要都用到的登录登出独立出来,放在公共模块中 public.py # coding=utf-8 class Login(): # login 登录 def login(self,driver): driver.find_element_by_id("IdInput").clea

上下文驱动测试

原则 语境驱动的学校的七个基本原则 任何实践的价值取决于其背景. 在上下文中有良好实践,但没有最佳实践. 人们一起工作是任何项目背景中最重要的部分. 随着时间的推移项目以往往无法预测的方式展开. 该产品是一种解决方案.如果问题仍未解决,则产品不起作用. 良好的软件测试是具有挑战性的智能过程 只有通过在整个项目中协同行使的判断和技巧,我们才能在合适的时间做正确的事情来有效地测试我们的产品. 行动原则的插图 存在测试组以提供与测试相关的服务.他们没有经营开发项目; 他们为项目服务. 代表利益相关者进

BCM_GPIO驱动测试

在写内核驱动的时候,最好先在uboot上,进行裸板测试,验证寄存器,再移植到内核中,这样可以熟悉寄存器,也排除内核中的一些干扰. /*********************************************************** * led.c * 53344中有16个GPIO,但是却不是在统一个GPIO寄存器中设置的, * GPIO0-GPIO3是以CMIC开头的寄存器, * GPIO4-GPIO16才是以GPIO开头的寄存器. *********************

linux下的can驱动测试

测试can需要ip,can-utils和libsocketcan库. 通过ip工具配置can,如速率,启用和禁用can等.不能用buildroot编译出来的ip,需要重新编译. 1. 编译ip: ip源码 http://pkgs.fedoraproject.org/repo/pkgs/iproute/iproute2-2.6.39.tar.gz/8a3b6bc77c2ecf752284aa4a6fc630a6/iproute2-2.6.39.tar.gz 1>. 修改Makefile DESTD

spi驱动之can总线mcp2515驱动测试

问1:linux内核.config Makefile Kbuild的关系? 答1:在word里可以找到答案 问2:因为mcp2515是spi转can芯片,所以首先移植spi驱动,分析spi驱动过程 答2: ----------------------------spi驱动整体框架--------------------------------------------- spi驱动分三个层次:spi核心层,spi控制器驱动层,spi设备驱动层 spi核心层 : 与平台无关,向上提供统一接口,位置S

W驱开技详.过滤驱动测试

<<Windows驱动开发技术详解>> 1.使用 第3章的 最简单的 WMD驱动做测试 1.1.之前就有疑问,第3章的驱动能够 动态的卸载,但是 第12章的驱动却不能 动态卸载 ZC:现在,有一些 感触,记录下来先:(第12章的驱动 应该算是 NT式驱动,下面的记录 应该也可以算是 NT式驱动和WDM驱动 的一些 区别感想) 代码中的区别现象:(1).没有 函数AddDevice(...) (2).没有 IRP_MJ_PNP的处理 ZC:我是这么理解的:WDM驱动 会在 AddDe

逻辑思维驱动 (测试) 工作管理

1. 引子 我们经常能够发现职场工作中的一些“能人”,他们的工作干练而高效,处处体现个人的价值.领导喜欢这样的人员,他们自然也有着更好的工作前途. 笔者个人在工作中间,自认也属于能力突出的类型,然而在知识传授的时候却又感觉这些泛泛而论的“能力”是很难传递的.在前几天参加ISTQB官方论坛的时候,专家的讲演让我有了一个思路,由此演化出今天这个课题,“逻辑思维驱动工作”. 2. 什么是逻辑思维 2.1 例子 什么是逻辑思维,他如何帮助到我的工作呢? 我们先举一个例子. 昨天有一位同学咨询了我一个问题

selenium学习:模块化驱动测试实例

登陆模块封装文件:public.py #coding=utf-8 from selenium import webdriver from time import sleep class Login():     #登陆     def user_login(self,driver):         driver.find_element_by_id("loginform-username").clear()         driver.find_element_by_id(&quo