2016-06-24 5 views
2

どのように私は次の関数のためのユニットテストを書くことができた:それは読み取り専用であるようはどのようにユニットテストのpythonのバージョンスイッチ

def version_switch(): 
    if sys.version_info.major < 3: 
     print('not python 3') 
    else: 
     print('python 3') 

私の最初の考えはsys.version_info.majorをからかっていたがすることは、それはしないだろう属性。

私は、py3とpy2の下でtoxを使ってテストスイートを実行します。ただし、各実行は1つのコードパスのみをチェックします。実際の関数は言語固有の機能を使用しません。バージョンを判断する別の方法、模擬するのが簡単なものを探すべきでしょうか?

+0

"実際の機能は言語固有の機能を使用していません" - それでは何がしますか?最初はなぜ 'sys.version_info'を見ていますか? – mgilson

+0

各バージョンで100%コードカバレッジを取得する方法をお尋ねしますか? –

+0

@SamDufel私は正当な理由なくカバーしたくないので、私は尋ねた。私は100を見る必要はありませんが、私はショートカットを取っていないことを知りたいです。 – Elbenfreund

答えて

4

あなたはsys.version_infomajorの値を交換することができないかもしれないが、あなたはsysversion_infoの値を入れ替えることができます:私はpython2.7を使用して、私よ

Python 2.7.10 (default, Oct 23 2015, 19:19:21) 
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.59.5)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import sys 
>>> import mock 
>>> with mock.patch.object(sys, 'version_info') as v_info: 
... v_info.major = 3 
... print(sys.version_info.major) 
... 
3 

注意sysが私にpython3.xを使っていると確信しています。

+0

明白なことを指摘していただきありがとうございます。 – Elbenfreund

+0

私は 'AttributeError:sysに属性 'version_info'がありません。私は誤って' sys 'ではなく 'sys'を使用していたので、ありがとうございます。 – Lotus

1

however, each run will only check one code path

だから?

ケア Python 2で実行した場合のPython 3のコードパス、またはその逆。それをテストする必要はありません。実行しているPythonのバージョンに出力が正しく対応していることを確認してください。

+0

私は同意しません。単体テストの観点からは、関数は '' sys.version_info''の値が何を表しているかを気にする必要はありません。それは両方の方法でカバーされているという事実によって反映されるべきもの。 – Elbenfreund

+0

@Elbenfreund:ユニットテストの観点からは、テスト対象のユニットは、実行中のPythonのバージョンを判断する必要があります。たとえば、あるオブジェクトの 'major'属性を' 3'と比較する関数の機能をテストしたい場合、バージョン情報オブジェクトをとり、その 'major'を比較するヘルパー関数を使うようにこの関数をリファクタリングしたいかもしれません属性を '3'に設定します。次にヘルパーを簡単にテストできます。 – user2357112

+0

あなたがここで求めているのは、 'fib(5)'の再帰的フィボナッチ関数の基本ケースコードパスをテストしようとするか、 'fib(1)'の再帰的caseコードパスをテストするようなことです。 – user2357112