【脚本语言系列】关于Python测试工具lettuce, 你需要知道的事

来源:互联网 发布:sqlserver教材 编辑:程序博客网 时间:2024/05/16 15:24

如何使用lettuce

  • 安装lettuce(先安装Python2.7或者Python3.5、Python3.6),即命令行输入以下命令:
pip install lettuce
  1. 定义问题:给定一个数,如何计算它的阶乘?
    注意:只有非负整数才有阶乘,0的阶乘为1。
  2. 项目结构:新建文件夹feautures,其内新建空文件steps.py以及空文件zero.feature。
    注意:文件名可以改变,feautures文件夹名以及其内文件的后缀名不能改变。lettuce将会在features文件夹中递归查找.py以及.feature。
    这里写图片描述
  3. 进行测试:

    • 1轮测试

      1. 描述行为,即用英文在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
      2. 用python定义步骤,即创建包含有描述步骤的python代码的steps.py文件
        现在有了测试方案的各步骤定义,因而Lettuce能够理解行为描述。
        这里写图片描述

        from lettuce import *@step('I have the number (\d+)')def have_the_number(step, number):    world.number = int(number)@step('I compute its factorial')def compute_its_factorial(step):    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

        定义被测函数,即在其他位置(非steps.py)中定义被测函数
        这里写图片描述

            def factorial(number):        return -1
      3. 运行测试并观察运行结果
        这里写图片描述

        lettuce
      4. 修改函数定义
        这里写图片描述

        def factorial(number):    return 1
      5. 再次运行测试并观察运行结果
        【配图1-5——一轮测试测试成功】

        lettuce
    • 2轮测试

      1. 描述行为
        这里写图片描述

         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        
      2. 用python定义步骤
        在第1次测试基础上不需要进行修改。
        定义被测函数
        在第1次测试基础上不需要进行修改。

      3. 运行测试并观察运行结果
        这里写图片描述

      4. 修改函数定义
        这里写图片描述

        def factorial(number):   number = int(number)   if (number == 0) or (number == 1):       return 1   else:       return number
      5. 再次运行测试并观察运行结果
        这里写图片描述

    • 3轮测试

      1. 描述行为
        【配图3-1——三轮测试行为描述】

         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     Scenario: Factorial of 4    Given I have the number 4    When I compute its factorial    Then I see the number 24    
      2. 用python定义步骤
        在第1次测试基础上不需要进行修改。
        定义被测函数
        在第1次测试基础上不需要进行修改。

      3. 运行测试并观察运行结果
        这里写图片描述

        def factorial(number):   number = int(number)   if (number == 0) or (number == 1):       return 1   else:       return number
      4. 修改函数定义
        这里写图片描述

      5. 再次运行测试并观察运行结果
        这里写图片描述
    • 4轮测试
      语法糖:函数名以及文档现在能够描述步骤语句;0.2.19版本以上支持。由函数名和函数文档来构造步骤语句,只需用不含有参数的”@step”标识符对函数进行装饰。以下的两个例子,分别以函数名以及文档进行描述,其本质与以上的例子相同。

      • 用函数名定义步骤
        这里写图片描述

        from lettuce import *@stepdef have_the_number(step, number):'I have the number (\d+)'world.number = int(number)@stepdef compute_its_factorial(step):world.number = factorial(world.number)@stepdef check_number(step, expected):'I see the number (\d+)'expected = int(expected)assert world.number == expected, \    "Got %d" % world.number  def factorial(number):number = int(number)if (number == 0) or (number == 1):    return 1else:    return number*factorial(number-1)
      • 用文档定义步骤
        这里写图片描述

        from lettuce import world, steps@stepsclass 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 = environsdef set_number(self, value):    self.environs.number = int(value)def get_number(self):    return self.environs.numberdef _assert_number_is(self, expected, msg="Got %d"):    number = self.get_number()    assert number == expected, msg % numberdef have_the_number(self, step, number):    '''I have the number (\d+)'''    self.set_number(number)def i_compute_its_factorial(self, step):    number = self.get_number()    self.set_number(factorial(number))def check_number(self, step, expected):    '''I see the number (\d+)'''    self._assert_number_is(int(expected))# Important!# Steps are added only when you instanciate the "@steps" decorated class# Internally decorator "@steps" build a closure with __init__FactorialSteps(world)def factorial(number):    number = int(number)    if (number == 0) or (number == 1):        return 1    else:        return number*factorial(number-1)                

什么是lettuce

lettuce是基于BDD(行为驱动开发)理念下非常有用和迷人的工具。
它可以执行纯文本功能描述用作Python项目的自动化测试,就像Cucumber对 Ruby一样。
lettuce使得开发和测试过程非常简单,可扩展,易读,而且最好的是,它允许不编程的人描述某个系统的行为,不需要想像这些描述会在开发过程中自动测试系统。

0 0
原创粉丝点击