2016-08-19 4 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 

そこにたくさんのファイルがあり、各ファイルは、行の多くが含まれているため、シナリオ概要にそれらのすべてをハードコーディングする可能性がありません。さらに、一度にファイル全体をメモリに読み込むのではなく、ジェネレータを使用して行を1つずつ反復することを避けたいと思います。

私は以下を試みました。しかし、大規模なデータセットや大量の条件では、各行が何度も何度も繰り返されるため、非常に効率的ではありません。複数のthenステップの間に1つの行を渡し、次の行の最初のthenステップで再び開始する可能性はありますか?

また、BDD/Gherkinはこの種のテストには適していませんか?代わりになるものは何ですか?

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

Dirkでは、シナリオのアウトライン(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

関連する問題