欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

用Python進行行為驅動開發(fā)的入門教程

 更新時間:2015年04月23日 10:29:16   投稿:goldensun  
這篇文章主要介紹了用Python進行行為驅動開發(fā)的入門教程,本文也對BDD的概念做了詳細的解釋,需要的朋友可以參考下

為驅動開發(fā)(Behavior-Driven Development,BDD)是一種卓越的開發(fā)模式。能幫助開發(fā)者養(yǎng)成日清日結的好習慣,從而避免甚至杜絕“最后一分鐘”的情況出現(xiàn),因此對提高代碼質量是大有裨益的。其與Gherkin語法相結合的測試結構及設計形式,使得對團隊的全部成員包括非技術人員都具有極好的易讀性。

所有代碼都必須進行測試,這意味著上線時把系統(tǒng)瑕疵降到最低甚至為零。這需要與完整的測試套件相配,從整體把控軟件行為,使得檢測與維護都能有序進行。這就是BDD的魅力所在,難道不心動嗎?

什么是BDD?

BDD的概念和理論源自TDD(測試驅動開發(fā)),類似于TDD的理論要點是在編碼前先寫好測試。不同點是除了使用單元測試進行細粒度化測試,還使用接受測試(acceptance tests)貫穿程序始末。接下來我們會結合Lettuce測試框架進行講解。

2015423101858798.jpg (600×241)

BDD過程可簡單概括為:

  •     編寫一個缺陷接受測試
  •     編寫一個缺陷單元測試
  •     使單元測試通過
  •     重構
  •     使接受測試通過

在每個功能里,如有需要重復上述步驟。

敏捷開發(fā)中的BDD

在敏捷開發(fā)中,BDD更是如魚得水。

如果項目的新功能和新需求每隔一、兩個星期就發(fā)生變更,那么該團隊需要配合進行快節(jié)奏的測試和編碼工作。Python中的接受和單元測試可以幫助實現(xiàn)該目標。

接受測試為人熟知的是使用了一個英文格式的“特性”描述文件,內容是含有的測試以及個別測試。這樣做的好處是使整個項目團隊都參與其中,除了開發(fā)者,還有管理者與商業(yè)分析者等不參與實際測試過程的非技術成員。

特性文件的編寫遵循全員可讀的規(guī)則,使技術和非技術成員都能清楚理解與接收。如果只包含單元測試,那么有可能會導致需求分析不全面或不能達成共識。接受測試的最大優(yōu)點是適用性強,不論項目規(guī)模大小都能運用自如。

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

特性文件

特性文件由英語寫成,內容是測試所覆蓋的程序范圍。此外還包括測試的創(chuàng)建任務。換言之,你除了需要編寫測試,還得規(guī)范自己就程序的方方面面編寫出良好的文檔。這樣做的好處是使自己對代碼上下都心中有數(shù),明確下一步做什么。隨著項目規(guī)模的擴大,文檔的重要性會逐步顯現(xiàn);例如重新回顧某個功能或對某個調用API進行回溯等等。

接下來會結合TDD中的一個實例創(chuàng)建一個特性文件。該實例是一個由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"

從該例子不難看出特性文件的描述是非常直截了當?shù)?,能夠使全體成員都能看明白。

特性文件的三個要點:

  •     Feature block(特性區(qū)塊):該處描述了測試組所涵蓋的程序內容。這里不執(zhí)行任何代碼,但能使閱讀者明白正要進行什么樣的特性測試。
  •     Background block(背景區(qū)塊):先于特性文件中每個場景(Scenario)區(qū)塊執(zhí)行。這類似于SetUp()方法用于進行創(chuàng)建代碼的編寫,例如進行條件和位置的編寫。
  •     Scenario block(場景區(qū)塊):這里用于定義測試。第一行用作文檔再一次的描述,接著是測試的具體內容。以這樣的風格編寫測試難道不是很簡單嗎?

步驟(Steps)文件

除了特性文件,步驟文件也是必須的,這是“見證奇跡的時刻”。顯然地,特性文件本身不會做出什么結果;它需要步驟文件依次地與Python執(zhí)行代碼一一映射才有最后的結果輸出。這里應用的是正則表達式。

正則表達式?不會過于復雜嗎?其實在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編碼方式進行表達式執(zhí)行。接著是使用正則表達式對引用的內容進行匹配,這里是要進行相加的數(shù)字。

然后是對Python方法傳入變量,變量名可任意定義,這里使用x和y作為calculator add方法的傳入變量名。

此外需要介紹world變量的使用。world是一個全局容器,使得變量可以在同一場景的不同步驟中使用。否則,所有變量只對應于其所在方法可用。例如把add方法的運算結果存放于某個step,而在另一外一個step進行結果的斷定。

特性的執(zhí)行

特性文件和步驟文件都完成后,接下來可以運行測試來看看能否通過。內建測試運行機的Lettuce執(zhí)行方式是很簡單的,例如

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的輸出是非常工整的,它清楚顯示了哪行特性文件代碼被執(zhí)行了,然后對成功執(zhí)行的行以高亮綠色顯示。此外還顯示了正在運行的特性文件以及行號,這對于測試失敗時進行特性文件缺陷行的查找是很有幫助的。輸出末尾是特性,場景,步驟的執(zhí)行個數(shù)以及通過個數(shù)的結果匯總。本例中所有測試都通過了。但如果出現(xiàn)錯誤,Lettuce會如何處理呢?

首先得對calculator.py代碼進行修改,把add方法改為兩數(shù)相減:
 

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方式。

不論使用什么工具,只要對某個工具運用熟練了,其它的自然能融會貫通。對教程文檔的熟讀是成功的第一步。

優(yōu)點

自信地進行代碼重構

使用一個完整測試套件的優(yōu)點是顯而易見的。找到一個強大的測試套件,會讓代碼重構工作事半功倍,信心滿滿。

隨著項目規(guī)模的不斷擴大,如果缺乏有效的工具,這不啻會使回溯和重構工作困難重重。如果有一套完整的接受測試來與每個特性一一對應,那么將能使變更工作有序不紊地進行,不會對現(xiàn)有功能模塊造成破壞。

全員都能參與其中的接受測試,將能極大地提升團隊戰(zhàn)斗力,一開始就朝著同一目標前進。程序員可把精力用在精確的目標上,避免需求范圍的失控;測試員可就特性文件進行一一檢閱,把測試環(huán)節(jié)做到極致。最后形成良性循環(huán),使得程序的每個特性都完美交付。

綜述

結合上述過程和工具,在過往工作過的團隊中我們都曾取得不錯的成績。BDD開發(fā)方式可使整個團隊保持專注,保持自信,保持活力,并使?jié)撛阱e誤降到最低。

相關文章

  • 實例代碼講解Python 線程池

    實例代碼講解Python 線程池

    這篇文章主要介紹了Python 線程池的相關資料,幫助大家更好的理解和學習python,感興趣的朋友可以了解下
    2020-08-08
  • Python中的With語句的使用及原理

    Python中的With語句的使用及原理

    這篇文章主要介紹了Python中的With語句的使用及原理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • Python基于均值漂移算法和分水嶺算法實現(xiàn)圖像分割

    Python基于均值漂移算法和分水嶺算法實現(xiàn)圖像分割

    圖像分割是將圖像分成若干具有獨特性質的區(qū)域并提取感興趣目標的技術和過程。這篇文章將詳細講解基于均值漂移算法和分水嶺算法的圖像分割,需要的可以參考一下
    2023-01-01
  • pandas讀取csv格式數(shù)據(jù)時header參數(shù)設置方法

    pandas讀取csv格式數(shù)據(jù)時header參數(shù)設置方法

    本文主要介紹了pandas讀取csv格式數(shù)據(jù)時header參數(shù)設置方法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Python實現(xiàn)8個概率分布公式的方法詳解

    Python實現(xiàn)8個概率分布公式的方法詳解

    在本文中,我們將介紹一些常見的分布(均勻分布、高斯分布、對數(shù)正態(tài)分布等)并通過Python代碼進行可視化以直觀地顯示它們,感興趣的可以學習一下
    2022-05-05
  • python遞歸刪除指定目錄及其所有內容的方法

    python遞歸刪除指定目錄及其所有內容的方法

    下面小編就為大家?guī)硪黄猵ython遞歸刪除指定目錄及其所有內容的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • Python 調用 zabbix api的方法示例

    Python 調用 zabbix api的方法示例

    這篇文章主要介紹了Python 調用 zabbix api的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • Python+tkinter實現(xiàn)制作文章搜索軟件

    Python+tkinter實現(xiàn)制作文章搜索軟件

    無聊的時候做了一個搜索文章的軟件,有沒有更加的方便快捷不知道,好玩就行了。軟件是利用Python和tkinter實現(xiàn)的,感興趣的可以嘗試一下
    2022-10-10
  • Windows8下安裝Python的BeautifulSoup

    Windows8下安裝Python的BeautifulSoup

    這篇文章主要介紹了Windows8下安裝Python的BeautifulSoup,本文著重講解安裝中出現(xiàn)的錯誤和解決方法,需要的朋友可以參考下
    2015-01-01
  • Python 實時獲取任務請求對應的Nginx日志的方法

    Python 實時獲取任務請求對應的Nginx日志的方法

    本文給大家分享Python 實時獲取任務請求對應的Nginx日志的方法,本文通過實例代碼給大家介紹的非常詳細,需要的朋友參考下吧
    2021-07-07

最新評論