一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語(yǔ)言編程技術(shù)及教程分享平臺(tái)!
分類(lèi)導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Python - 用Python進(jìn)行行為驅(qū)動(dòng)開(kāi)發(fā)的入門(mén)教程

用Python進(jìn)行行為驅(qū)動(dòng)開(kāi)發(fā)的入門(mén)教程

2020-06-11 09:41腳本之家 Python

這篇文章主要介紹了用Python進(jìn)行行為驅(qū)動(dòng)開(kāi)發(fā)的入門(mén)教程,本文也對(duì)BDD的概念做了詳細(xì)的解釋,需要的朋友可以參考下

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

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

什么是BDD?

BDD的概念和理論源自TDD(測(cè)試驅(qū)動(dòng)開(kāi)發(fā)),類(lèi)似于TDD的理論要點(diǎn)是在編碼前先寫(xiě)好測(cè)試。不同點(diǎn)是除了使用單元測(cè)試進(jìn)行細(xì)粒度化測(cè)試,還使用接受測(cè)試(acceptance tests)貫穿程序始末。接下來(lái)我們會(huì)結(jié)合Lettuce測(cè)試框架進(jìn)行講解。

用Python進(jìn)行行為驅(qū)動(dòng)開(kāi)發(fā)的入門(mén)教程

BDD過(guò)程可簡(jiǎn)單概括為:

  •     編寫(xiě)一個(gè)缺陷接受測(cè)試
  •     編寫(xiě)一個(gè)缺陷單元測(cè)試
  •     使單元測(cè)試通過(guò)
  •     重構(gòu)
  •     使接受測(cè)試通過(guò)

在每個(gè)功能里,如有需要重復(fù)上述步驟。

敏捷開(kāi)發(fā)中的BDD

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

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

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

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

Gherkin語(yǔ)法

通常會(huì)使用Gherkin來(lái)編寫(xiě)接受測(cè)試,Gherkin來(lái)自Cucumber框架,由Ruby語(yǔ)言所編寫(xiě)。Gherkin語(yǔ)法十分簡(jiǎn)單,在Lettuce Python中主要使用以下8點(diǎn)來(lái)進(jìn)行特性和測(cè)試的定義:

  •     Given假設(shè)
  •     When時(shí)間
  •     Then下一步
  •     And與
  •     Feature特性:
  •     Background背景:
  •     Scenario Outline場(chǎng)合大綱:

安裝

使用Python常用的pip install語(yǔ)句就可完成Lettuce包的安裝:
 

?
1
$ pip install lettuce

$ lettuce /path/to/example.feature用于運(yùn)行測(cè)試。可以每次只運(yùn)行一個(gè)測(cè)試文件,或者是提交目錄名來(lái)運(yùn)行目錄下的所有文件。

為了使測(cè)試的編寫(xiě)和使用更加容易,我們建議把nosetests也安裝好:
 

?
1
$ pip install nose

特性文件

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

接下來(lái)會(huì)結(jié)合TDD中的一個(gè)實(shí)例創(chuàng)建一個(gè)特性文件。該實(shí)例是一個(gè)由Python寫(xiě)成的簡(jiǎn)易計(jì)算器,同時(shí)會(huì)演示接受測(cè)試的基本寫(xiě)法。目錄構(gòu)成的建議是建立兩個(gè)文件夾,一個(gè)是app,用于放置代碼文件如calculator.py;另一個(gè)是tests,用于放置特性文件夾。

?
1
2
3
4
5
6
7
8
9
10
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
 

?
1
2
3
4
5
6
7
8
9
10
11
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"

從該例子不難看出特性文件的描述是非常直截了當(dāng)?shù)模軌蚴谷w成員都能看明白。

特性文件的三個(gè)要點(diǎn):

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

步驟(Steps)文件

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

正則表達(dá)式?不會(huì)過(guò)于復(fù)雜嗎?其實(shí)在BDD世界里,正則表達(dá)式常用于捕捉整個(gè)字符串或從某行抓取變量。所以熟能生巧。

正則表達(dá)式?在測(cè)試中使用不會(huì)太復(fù)雜嗎?在Lettuce是不會(huì)的,反而是非常簡(jiǎn)單的。

以下是對(duì)應(yīng)的步驟文件的編寫(xiě):
 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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)

文件首部分是標(biāo)準(zhǔn)的導(dǎo)入寫(xiě)法。例如對(duì)Calculator的訪問(wèn)和Lettuce工具的導(dǎo)入,還有nosetest包中assert_equals斷定方法的導(dǎo)入。接下來(lái),你就可以開(kāi)始針對(duì)特性文件的每一行進(jìn)行步驟定義。如前所述,正則表達(dá)式很多時(shí)候用于提取整個(gè)字符串,除了有時(shí)需要在某行對(duì)變量進(jìn)行訪問(wèn)。

在這個(gè)例子中, 里的@step起到解碼提取的作用;u字母的意思是以u(píng)nicode編碼方式進(jìn)行表達(dá)式執(zhí)行。接著是使用正則表達(dá)式對(duì)引用的內(nèi)容進(jìn)行匹配,這里是要進(jìn)行相加的數(shù)字。

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

此外需要介紹world變量的使用。world是一個(gè)全局容器,使得變量可以在同一場(chǎng)景的不同步驟中使用。否則,所有變量只對(duì)應(yīng)于其所在方法可用。例如把a(bǔ)dd方法的運(yùn)算結(jié)果存放于某個(gè)step,而在另一外一個(gè)step進(jìn)行結(jié)果的斷定。

特性的執(zhí)行

特性文件和步驟文件都完成后,接下來(lái)可以運(yùn)行測(cè)試來(lái)看看能否通過(guò)。內(nèi)建測(cè)試運(yùn)行機(jī)的Lettuce執(zhí)行方式是很簡(jiǎn)單的,例如

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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í)行了,然后對(duì)成功執(zhí)行的行以高亮綠色顯示。此外還顯示了正在運(yùn)行的特性文件以及行號(hào),這對(duì)于測(cè)試失敗時(shí)進(jìn)行特性文件缺陷行的查找是很有幫助的。輸出末尾是特性,場(chǎng)景,步驟的執(zhí)行個(gè)數(shù)以及通過(guò)個(gè)數(shù)的結(jié)果匯總。本例中所有測(cè)試都通過(guò)了。但如果出現(xiàn)錯(cuò)誤,Lettuce會(huì)如何處理呢?

首先得對(duì)calculator.py代碼進(jìn)行修改,把a(bǔ)dd方法改為兩數(shù)相減:
 

?
1
2
3
4
5
6
7
8
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

再次運(yùn)行,看看Lettuce是如何對(duì)錯(cuò)誤進(jìn)行說(shuō)明的:
 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
$ 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

顯然,實(shí)際結(jié)果0與預(yù)期結(jié)果4是不符的。Lettuce清楚顯示了該問(wèn)題,接下來(lái)就是調(diào)試排錯(cuò)直到通過(guò)的時(shí)間了。

其它工具
在Python中還提供了很多不同的工具來(lái)進(jìn)行類(lèi)似的測(cè)試,這些工具基本源自Cucumber。例如:

  •     Behave:這是一個(gè)Cucumber接口。文檔配套齊備,保持更新,有不少的配套工具。
  •     Freshen:另一個(gè)Cucumber接口,配套網(wǎng)站有完整的教程和實(shí)例,安裝方式都是簡(jiǎn)單的pip方式。

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

優(yōu)點(diǎn)

自信地進(jìn)行代碼重構(gòu)

使用一個(gè)完整測(cè)試套件的優(yōu)點(diǎn)是顯而易見(jiàn)的。找到一個(gè)強(qiáng)大的測(cè)試套件,會(huì)讓代碼重構(gòu)工作事半功倍,信心滿滿。

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

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

綜述

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 白丝校花被扒开双腿喷水小说 | 亚洲精品一区二区久久久久 | 草莓视频幸福宝 | 国外欧美一区另类中文字幕 | 亚洲国产精品二区久久 | 日韩一区二区三区不卡视频 | 色哟哟精品 | 99热在线免费观看 | 极品妖艳许清赵丽全文免费阅读 | 成人免费影 | 亚洲精品在看在线观看 | 亚洲四虎永久在线播放 | 日本漫画工囗全彩内番e绅 日本伦理动漫在线观看 | 国产福利片在线 易阳 | 九九精品热 | 美女露奶奶 | 亚洲国产成人久久99精品 | 久久青草免费91线频观看站街 | 欧美日韩高清完整版在线观看免费 | 四虎影视免费 | 久久热这里面只有精品 | 欧美另类变态 | 免费视频完整版在线观看网站 | a v在线男人的天堂观看免费 | 成人综合婷婷国产精品久久免费 | 高贵女王调奴vk | 国产精品美女久久久久 | 久久AV国产麻豆HD真实 | 亚洲国产AV无码综合在线 | 美女被扒开屁股进去网 | 韩国日本在线观看 | 国产欧美国产综合第一区 | 久久噜国产精品拍拍拍拍 | 日本在线观看www鲁啊鲁视频 | 二次元美女互摸隐私互扒 | 国产精品久久久久久吹潮 | 国产午夜精品久久理论片 | 欧美国产日韩综合 | 韩国最新理论片奇忧影院 | 国自产拍在线天天更新91 | 天天做天天爱天天一爽一毛片 |