xml地图|网站地图|网站标签 [设为首页] [加入收藏]

智能家电

当前位置:美高梅游戏网站 > 智能家电 > 用Python进行行为驱动开发的入门教程,python驱动

用Python进行行为驱动开发的入门教程,python驱动

来源:http://www.gd-chuangmei.com 作者:美高梅游戏网站 时间:2019-09-03 23:24

用Python进行行为驱动开发的入门教程,python驱动开发

为驱动开发(Behavior-Driven Development,BDD)是一种卓越的开发模式。能帮助开发者养成日清日结的好习惯,从而避免甚至杜绝“最后一分钟”的情况出现,因此对提高代码质量是大有裨益的。其与Gherkin语法相结合的测试结构及设计形式,使得对团队的全部成员包括非技术人员都具有极好的易读性。

所有代码都必须进行测试,这意味着上线时把系统瑕疵降到最低甚至为零。这需要与完整的测试套件相配,从整体把控软件行为,使得检测与维护都能有序进行。这就是BDD的魅力所在,难道不心动吗?

什么是BDD?

BDD的概念和理论源自TDD(测试驱动开发),类似于TDD的理论要点是在编码前先写好测试。不同点是除了使用单元测试进行细粒度化测试,还使用接受测试(acceptance tests)贯穿程序始末。接下来我们会结合Lettuce测试框架进行讲解。

图片 1

BDD过程可简单概括为:

  •     编写一个缺陷接受测试
  •     编写一个缺陷单元测试
  •     使单元测试通过
  •     重构
  •     使接受测试通过

在每个功能里,如有需要重复上述步骤。

敏捷开发中的BDD

在敏捷开发中,BDD更是如鱼得水。

如果项目的新功能和新需求每隔一、两个星期就发生变更,那么该团队需要配合进行快节奏的测试和编码工作。Python中的接受和单元测试可以帮助实现该目标。

接受测试为人熟知的是使用了一个英文格式的“特性”描述文件,内容是含有的测试以及个别测试。这样做的好处是使整个项目团队都参与其中,除了开发者,还有管理者与商业分析者等不参与实际测试过程的非技术成员。

特性文件的编写遵循全员可读的规则,使技术和非技术成员都能清楚理解与接收。如果只包含单元测试,那么有可能会导致需求分析不全面或不能达成共识。接受测试的最大优点是适用性强,不论项目规模大小都能运用自如。

Gherkin语法

通常会使用Gherkin来编写接受测试,Gherkin来自Cucumber框架,由Ruby语言所编写。Gherkin语法十分简单,在Lettuce Python中主要使用以下8点来进行特性和测试的定义:

  •     Given假设
  •     When时间
  •     Then下一步
  •     And与
  •     Feature特性:
  •     Background背景:
  •     Scenario Outline场合大纲:

安装

使用Python常用的pip install语句就可完成Lettuce包的安装:  

$ pip install lettuce

$ lettuce /path/to/example.feature用于运行测试。可以每次只运行一个测试文件,或者是提交目录名来运行目录下的所有文件。

为了使测试的编写和使用更加容易,我们建议把nosetests也安装好:  

$ pip install nose

特性文件

特性文件由英语写成,内容是测试所覆盖的程序范围。此外还包括测试的创建任务。换言之,你除了需要编写测试,还得规范自己就程序的方方面面编写出良好的文档。这样做的好处是使自己对代码上下都心中有数,明确下一步做什么。随着项目规模的扩大,文档的重要性会逐步显现;例如重新回顾某个功能或对某个调用API进行回溯等等。

接下来会结合TDD中的一个实例创建一个特性文件。该实例是一个由Python写成的简易计算器,同时会演示接受测试的基本写法。目录构成的建议是建立两个文件夹,一个是app,用于放置代码文件如calculator.py;另一个是tests,用于放置特性文件夹。

calculator.py:

class Calculator(object):
  def add(self, x, y):
    number_types = (int, long, float, complex)

    if isinstance(x, number_types) and isinstance(y, number_types):
      return x + y
    else:
      raise ValueError

tests/features目录下的特性文件calculator.feature  

Feature: As a writer for NetTuts
 I wish to demonstrate
 How easy writing Acceptance Tests
 In Python really is.

 Background:
  Given I am using the calculator

 Scenario: Calculate 2 plus 2 on our calculator
  Given I input "2" add "2"
  Then I should see "4"

从该例子不难看出特性文件的描述是非常直截了当的,能够使全体成员都能看明白。

特性文件的三个要点:

  •     Feature block(特性区块):该处描述了测试组所涵盖的程序内容。这里不执行任何代码,但能使阅读者明白正要进行什么样的特性测试。
  •     Background block(背景区块):先于特性文件中每个场景(Scenario)区块执行。这类似于SetUp()方法用于进行创建代码的编写,例如进行条件和位置的编写。
  •     Scenario block(场景区块):这里用于定义测试。第一行用作文档再一次的描述,接着是测试的具体内容。以这样的风格编写测试难道不是很简单吗?

步骤(Steps)文件

除了特性文件,步骤文件也是必须的,这是“见证奇迹的时刻”。显然地,特性文件本身不会做出什么结果;它需要步骤文件依次地与Python执行代码一一映射才有最后的结果输出。这里应用的是正则表达式。

正则表达式?不会过于复杂吗?其实在BDD世界里,正则表达式常用于捕捉整个字符串或从某行抓取变量。所以熟能生巧。

正则表达式?在测试中使用不会太复杂吗?在Lettuce是不会的,反而是非常简单的。

以下是对应的步骤文件的编写:  

from lettuce import *
from nose.tools import assert_equals
from app.calculator import Calculator


@step(u'I am using the calculator')
def select_calc(step):
  print ('Attempting to use calculator...')
  world.calc = Calculator()


@step(u'I input "([^"]*)" add "([^"]*)"')
def given_i_input_group1_add_group1(step, x, y):
  world.result = world.calc.add(int(x), int(y))


@step(u'I should see "([^"]+)"')
def result(step, expected_result):
  actual_result = world.result
  assert_equals(int(expected_result), actual_result)

文件首部分是标准的导入写法。例如对Calculator的访问和Lettuce工具的导入,还有nosetest包中assert_equals断定方法的导入。接下来,你就可以开始针对特性文件的每一行进行步骤定义。如前所述,正则表达式很多时候用于提取整个字符串,除了有时需要在某行对变量进行访问。

在这个例子中, 里的@step起到解码提取的作用;u字母的意思是以unicode编码方式进行表达式执行。接着是使用正则表达式对引用的内容进行匹配,这里是要进行相加的数字。

然后是对Python方法传入变量,变量名可任意定义,这里使用x和y作为calculator add方法的传入变量名。

此外需要介绍world变量的使用。world是一个全局容器,使得变量可以在同一场景的不同步骤中使用。否则,所有变量只对应于其所在方法可用。例如把add方法的运算结果存放于某个step,而在另一外一个step进行结果的断定。

特性的执行

特性文件和步骤文件都完成后,接下来可以运行测试来看看能否通过。内建测试运行机的Lettuce执行方式是很简单的,例如

lettuce test/features/calculator.feature:

$ lettuce tests/features/calculator.feature 

Feature: As a writer for NetTuts         # tests/features/calculator.feature:1
 I wish to demonstrate             # tests/features/calculator.feature:2
 How easy writing Acceptance Tests       # tests/features/calculator.feature:3
 In Python really is.              # tests/features/calculator.feature:4

 Background:
  Given I am using the calculator       # tests/features/steps.py:6
  Given I am using the calculator       # tests/features/steps.py:6

 Scenario: Calculate 2 plus 2 on our calculator # tests/features/calculator.feature:9
  Given I input "2" add "2"          # tests/features/steps.py:11
  Then I should see "4"            # tests/features/steps.py:16

1 feature (1 passed)
1 scenario (1 passed)
2 steps (2 passed)

Lettuce的输出是非常工整的,它清楚显示了哪行特性文件代码被执行了,然后对成功执行的行以高亮绿色显示。此外还显示了正在运行的特性文件以及行号,这对于测试失败时进行特性文件缺陷行的查找是很有帮助的。输出末尾是特性,场景,步骤的执行个数以及通过个数的结果汇总。本例中所有测试都通过了。但如果出现错误,Lettuce会如何处理呢?

首先得对calculator.py代码进行修改,把add方法改为两数相减:  

class Calculator(object):
  def add(self, x, y):
    number_types = (int, long, float, complex)

    if isinstance(x, number_types) and isinstance(y, number_types):
      return x - y
    else:
      raise ValueError

再次运行,看看Lettuce是如何对错误进行说明的:  

$ lettuce tests/features/calculator.feature 

Feature: As a writer for NetTuts         # tests/features/calculator.feature:1
 I wish to demonstrate             # tests/features/calculator.feature:2
 How easy writing Acceptance Tests       # tests/features/calculator.feature:3
 In Python really is.              # tests/features/calculator.feature:4

 Background:
  Given I am using the calculator       # tests/features/steps.py:6
  Given I am using the calculator       # tests/features/steps.py:6

 Scenario: Calculate 2 plus 2 on our calculator # tests/features/calculator.feature:9
  Given I input "2" add "2"          # tests/features/steps.py:11
  Then I should see "4"            # tests/features/steps.py:16
  Traceback (most recent call last):
   File "/Users/user/.virtualenvs/bdd-in-python/lib/python2.7/site-packages/lettuce/core.py", line 144, in __call__
    ret = self.function(self.step, *args, **kw)
   File "/Users/user/Documents/Articles - NetTuts/BDD_in_Python/tests/features/steps.py", line 18, in result
    assert_equals(int(expected_result), actual_result)
   File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/unittest/case.py", line 515, in assertEqual
    assertion_func(first, second, msg=msg)
   File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/unittest/case.py", line 508, in _baseAssertEqual
    raise self.failureException(msg)
  AssertionError: 4 != 0

1 feature (0 passed)
1 scenario (0 passed)
2 steps (1 failed, 1 passed)

List of failed scenarios:
 Scenario: Calculate 2 plus 2 on our calculator # tests/features/calculator.feature:9

显然,实际结果0与预期结果4是不符的。Lettuce清楚显示了该问题,接下来就是调试排错直到通过的时间了。

其它工具 在Python中还提供了很多不同的工具来进行类似的测试,这些工具基本源自Cucumber。例如:

  •     Behave:这是一个Cucumber接口。文档配套齐备,保持更新,有不少的配套工具。
  •     Freshen:另一个Cucumber接口,配套网站有完整的教程和实例,安装方式都是简单的pip方式。

不论使用什么工具,只要对某个工具运用熟练了,其它的自然能融会贯通。对教程文档的熟读是成功的第一步。

优点

自信地进行代码重构

使用一个完整测试套件的优点是显而易见的。找到一个强大的测试套件,会让代码重构工作事半功倍,信心满满。

随着项目规模的不断扩大,如果缺乏有效的工具,这不啻会使回溯和重构工作困难重重。如果有一套完整的接受测试来与每个特性一一对应,那么将能使变更工作有序不紊地进行,不会对现有功能模块造成破坏。

全员都能参与其中的接受测试,将能极大地提升团队战斗力,一开始就朝着同一目标前进。程序员可把精力用在精确的目标上,避免需求范围的失控;测试员可就特性文件进行一一检阅,把测试环节做到极致。最后形成良性循环,使得程序的每个特性都完美交付。

综述

结合上述过程和工具,在过往工作过的团队中我们都曾取得不错的成绩。BDD开发方式可使整个团队保持专注,保持自信,保持活力,并使潜在错误降到最低。

为驱动开发(Behavior-Driven Development,BDD)是一种卓越的开发模式。能帮助开发者养成日清日...

Python入门教程(1),python入门教程

人生苦短,我用Python!

  Python(英语发音:/ˈpaɪθən/), 是一种面向对象、解释型计算机程序设计语言,由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年,Python 源代码同样遵循 GPL(GNU General Public License)协议。Python语法简洁而清晰,具有丰富和强大的类库。它常被昵称为胶水语言,能够把用其他语言制作的各种模块(尤其是C/C++)很轻松地联结在一起。常见的一种应用情形是,使用Python快速生成程序的原型(有时甚至是程序的最终界面),然后对其中有特别要求的部分,用更合适的语言改写,比如3D游戏中的图形渲染模块,性能要求特别高,就可以用C/C++重写,而后封装为Python可以调用的扩展类库。需要注意的是在您使用扩展类库时可能需要考虑平台问题,某些可能不提供跨平台的实现。

第一章Python入门

前言

  Python可能是少有的一种可以称的上既简单且功能强大的编程语言。对于初学者和专家都是一种全新的体验,更重要的是用它来编程是一件非常快乐的事情。本书将带你进入一个全新的编程奇妙之旅(书中会有彩蛋哦!)——实质上“为你的编程带来快乐!为你的编程提供完美的解决方案”。

  那么在我们开始正式的接触Python这门无所不能的语言,所以我们先来了解一下它的历史:

  1、Python语言概述

  Python入门篇是一本系统而科学的入门教程,Python是诞生于1989年的一种开放源代码的脚本编程语言,简单优雅,功能强大,涉及多方领域。它的语言风格清晰,具有较强的可读性,应用非常广泛。

  Python语言的官方简介是:

              Python是一种简单易学,功能强大的编程语言,它有更高效率的高层数据结构,简单而有效地实现面向对象编程,Python简洁的语法和对动态的输入的支持,再加上解释性的语言的本质,使得它在大多数平台上的许多领域都是一个理想的脚本语言,特别适用于快速的应用程序开发。

  2、Python语言的特点

  1.简单

  Python是一种简单美,在编程的过程中你会感受到它就像一本英文书籍一样,尽管这个这本书籍格式很严格!Python的这种伪代码本质是它的最大的特点之一。

  2.易学

    就如你即将看到的一样,它是极其容易操作的语言。

  3.免费、开源

  Python是FLOSS(自由/开源源码软件)之一。你可以自由的发布这个软件的拷贝、阅读它的源代码、对它做改动、自由设计它的编程思路、自由发布你所创新的东西。FLOSS是基于一个团体分享知识的概念。这也是为什么Python成为优秀的编程语言之一。

  4.可移植性

  由于它的开源本质,Python已经被移植在许多平台上(它可在许多工作平台上进行操作)。如果小心地避免使用依赖性的系统特性,那么你的Python程序无序修改就可以在下述任何平台上面运行。

  这些平台包括Linux、Windows、FreeBSD、Macintosh、Solaris、OS/2、Amiga、AROS、AS/400、BeOS、OS/390、…等等

  5.解释性

  一个用编译性语言如C或C++写的程序可以从源文件(即C或C++语言)转换到一个你的计算机使用的语言(二进制代码,即0和1)。

  Python语言写的程序不需要编译成二进制代码。你可以直接从源代码运行程序。在计算机内部,Python解释器把源代码转换成成为字节码的中间形式,然后再把它翻译成计算机使用语言并运行。你可以直接将Python程序拷贝到另一台计算机上,它就可以工作了,这也使得你的Python程序更加易于移植。

  6、面向对象

  Python即支持面向过程的编程也支持面向对象的编程。在面向过程的语言中,程序是由过程或仅仅是可重用代码的函数构建起来的。与其他主要的语言如C++和Java相比,Python以一种非常强大又简单的方式实现面向对象编程。

  7、可扩展性

     你可以将部分程序用C++或C编写,然后再Python程序中使用它们。

  8、可嵌入性

     你可以将Python嵌入你的C/C++程序,从而向你的程序用户提供脚本功能。

  9、丰富的库

     Python标准库很庞大。它可以帮你处理各种工作,包括主要的正则表达式、文档生成、单元测试、线程、数据库、网页浏览…等等。

  10、Python的语种

  对于初学者面对的Python世界有两种语言,Python2和Python3,那么两个版本的区别就在于两种的语法有很大的不同,在开发领域上会造成很多的不兼容。

  Python2是Python里面一个非常重要的版本,最早的版本是从2001的时候开始的,特别是从2006年开始py2.5的发布,python的功能逐渐强大起来,慢慢开始稳定下来,并且差不多1-2年左右递增一个版本,在08年左右开始慢慢的火起来了,但Python2只支持到2020年。而Python3最早是从2008开始发布,但是py3.0的版本非常不稳定,所以社区更新的很快,差不多几个月就更新一次。所以一开始的时候并没有很多人用,只到2014春暖花开的时候python3.4 deliver了才开始慢慢稳定下来。

 

  这是Python社区联和一些网站在2014做的一个调查,关于Python2/3,部分的结果如下:

  1).97.51%用户还在写Python2的代码

  2).60%的用户写Python3的代码

  3).78.09%的用户更多地写Python2代码

  4).77.09%的用户认可Python3

选择还是要根据自己的需求若是企业的开发,要满足工作的需求,尤其是依赖的软件只能运行在Python2下,首选Python2.比如你的开发需要依赖大量的第三方的库(因为学Python非常大的一个原因就是因为它有成千上万的第三方包),像大量的数据分析,科学计算,还是选Python2吧。

如果你是自己学习,研究的话,愿意拥抱变化,那么建议学Python3,因为它是未来的方向。

编程其实主要是对编程思想的理解和经验的积累,千万不要因为纠结学Py2还是Py3而浪费大量时间。Py2和Py3里面的思想基本是相通的,招式是类似的.当你熟悉Python到一定的程序的时候,会Py2的人学Py3只需要很短的时间。所以不要再纠结细枝末节的语法差异,而耽误了宝贵的学习时间。

  3、Python的下载和安装

本文由美高梅游戏网站发布于智能家电,转载请注明出处:用Python进行行为驱动开发的入门教程,python驱动

关键词: