2017-06-25 21 views
-1

私は、複数のコンテキストでYAML設定パーサを使用するパッケージを作成しています。pytestでYAML configパーサをテストする

パーサーをpy.testでテストする必要があります。パーササブパッケージが適用される各コンテキストのクラスを作成しています。

私はクラスごとにYAMLファイルをロードし、そのクラスのすべてのテストで利用できるようにする必要があります。

私の例は良いアプローチの下にあるのでしょうか、それとも私がやるべきことがありますか?

import pytest 
import yaml 
import my_package 

class context_one: 
    @pytest.fixture 
    def parse_context(self): 
     return my_package.parse.context # module within parser for certain context 

    @pytest.fixture 
    def test_yaml_context(self): 
     with open('test_yaml.yml') as yaml_file: 
      return yaml.load(yaml_file) 

    def test_validation_function1(self,parse_context,test_yaml_context): 

     test_yaml = test_yaml_context['validation_function1'] 

     # test that missing key raises error 
     with pytest.raises(KeyError): 
      parse_context.validation_function1(test_yaml['missing_key_case']) 


     # test that invalid value raises error 
     with pytest.raises(ValueError): 
      parse_context.validation_function1(test_yaml['invalid_value_case']) 

これは機能します。私はpy.test文書ではあまり見つからないので、私は尋ねると思っていましたが、これらの行に沿ったものは、一般的な使用例のようなものだと感じています。具体的に

: 私はテストモジュールレベルでYAMLをロードした場合、テストはそれを見つけることができない備品

  • を持っている必要があります理由わからない - これは単なる道のPYですテストは動作しますか?
  • 私はテストモジュールレベルでmy_package.parse_contextをインポートするだけですか?
+0

なぜあなたのテストがどのように動作しているか心配しているのですが、テストだけです。 ** PyYAMLの使用、特に 'yaml.load()'の使用について心配する必要があります。これは、PyYAMLのマニュアルで説明されているように、安全でない(ディスクを消去するか、制御されない入力で悪化する)ことがあります。実際にそれを使用することは絶対に必要ではないので、なぜそのリスクを最初に実行するのですか? 'safe_load()'を使い、必要なコンストラクタで拡張してください。 – Anthon

+0

YAMLのセキュリティ問題について教えていただきありがとうございます。ただし、この場合、YAMLは、パッケージが使用する設定ファイルとしてユーザ自身によって書き込まれます。だから、彼らが(おそらくそうではない)自分自身をハックしようとしているのでなければ、それはこのケースでは心配してはいけません。私が設定ファイルによって何を意味するのか明確でない場合は申し訳ありません – NickleDave

答えて

1
  1. これらは必要ありません。私はsetup_module()を定義して、すべてのテストでtest_yaml.ymlを一度読み込んで解析します。

  2. いいえ奇妙な問題です。私はそれをデバッグする場合は、私は現在のディレクトリを記録するだろう。または、単にテストファイルに関連するファイル、open(os.path.join(os.path.dirname(__file__), 'test_yaml.yml'))を開きます。

  3. はい、どうしてですか?

+0

うーん。さて、.ymlをクラス*の外側の変数*にロードすると、そのクラスの中のメソッド*がその変数を見つけることができますが、クラスの内部で.yml *をロードすると、メソッド*それを見つける。私は、クラスの__init__メソッドを書き、クラスのプロパティに.ymlを格納しようとしましたが、__init__を定義するとpytestはエラーをスローします。ここにOOコードについて理解していないものがありますか? – NickleDave

+0

pytestはテストクラスが好きではなく、テスト用の関数を好んでいます。テスト関数でクラスをテストできます。 – phd

+0

同様の問題とその回答をhttps://stackoverflow.com/a/44431292/7976758で確認してください – phd

関連する問題