2016-08-19 34 views
1

我正在嘗試使用Python的behave library來編寫一些BDD/Gherkin風格的測試,這些測試用於一組分隔文本文件。如何處理Python中的迭代/循環行爲或BDD方案?

一個典型的情況是這樣的:

Scenario: Check delivery files for illegal values 
    Given a file system path to the delivery folder 
    When I open each file and read its values 
    Then all values in the "foo" column are smaller than 1 
    And all values in the "fizz" column are larger than 2 

由於有大量的文件和每個文件都包含大量的行,有沒有可能硬編碼個個成一個方案概述。此外,我想避免一次性將整個文件讀入內存,而是使用生成器逐一遍歷行。

我嘗試了以下。但是,對於大數據集和大量條件來說,這是非常低效的,因爲每個步驟都會一遍一遍讀取每行。是否有可能在多個then步驟之間傳遞單個行,並在下一行的第一個步驟then處再次啓動?

或者是BDD /小黃瓜不適合這種類型的測試?有什麼可以替代的?

import csv 
import itertools 
import os 

@given('a file system path to the delivery folder') 
def step(context): 
    context.path = '/path/to/delivery/files' 

@when('I open each file and read its values') 
def step(context): 

    file_list = os.listdir(context.path) 

    def row_generator(): 
     for path in file_list: 
      with open(path, 'rb') as csvfile: 
       reader = csv.reader(csvfile) 
       for row in reader: 
        yield row 

    context.row_generator = row_generator 

# itertools.tee forks off the row generator so it can be used multiple times instead of being exhausted after the first 'then' step 

@then('all values in the "foo" column are smaller than 1') 
def step(context): 
    for row in itertools.tee(context.row_generator(), 1)[0]: 
     assert row['foo'] < 1 

@then('all values in the "bar" column are larger than 2') 
def step(context): 
    for row in itertools.tee(context.row_generator(), 1)[0]: 
     assert row['bar'] > 2 

回答

0

德克,你可以考慮編寫一個腳本來生成場景大綱(給出csv文件)。這樣你就可以依靠標準的行爲/小黃瓜功能。儘可能簡單,因爲它引入了另一個可能出錯的地方。但是,它簡化了步驟文件,因此您可以專注於實際的功能測試,而不是閱讀csv文件的機制。根據數據集的大小,您可能會遇到內存限制,因爲我認爲該表僅保存在內存中。不是一個很好的解決方案,而是「替代方案」。

-2

爲了實現我的情景一般循環 - 我做它像下面。當然,您必須編寫步驟定義,這可能與創建日誌條目一樣簡單。

@test 
Scenario Outline: Repeat Step in Loop 
Given we repeat the same test X times 
When we do something 
Then we analyze results 
Examples: Iteration 
    | X | 
    | 1 | 
    | 2 | 
    | 3 | 

想法歡迎一個更好的方法。迭代不計劃和有硬編碼(小腳本生成示例表)

+0

的OP在提問中寫道:「由於有大量的文件和每個文件都包含大量的行,**沒有可能將所有這些硬編碼到場景大綱**中。「 (強調添加。) – Louis