2016-10-22 6 views
0

pytestを使用して単体テストを実行しようとしています。私のユニットテストコードにソースコードをインポートしてテストします。しかし、単体テストを行っている間、私はソースコード内のコードの一部を実行したりコメントアウトしたりしません。しかし、私はソースコードを変更することはできません。だから、実行中に私のソースコード内のコードブロックをコメントする方法はありますか?コードの一部のみを実行する方法

+0

ソースコードを変更できない場合、どの部分を無視するべきでしょうか? – weidler

+1

テストされたソースコードを変更する理由は何ですか?ユニットテストの考え方は、ソースをそのままテストすることです。私はこれが[XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)であると言います。実際に達成したいことを教えてください。 – zvone

+0

無視したい部分のコードは、自動テストでテストされています。私は実際にその部分を無視することができます。だから私はこれをやりたかったのです。 –

答えて

1

あなたが強くしようとしているのは、何らかの理由でユニットテストを実行できない場合、ソースコードをリファクタリングする必要があるということです。どんな解決策を思いついても、非常に壊れやすいでしょう。つまり、@ user7056566が指摘したように、文字列として読み込んだり(regexなどで)修正してからexecに電話するだけです。

個人的には、「無視したいコードの一部が自動テストでテストされている」という事実を無視します。 "パフォーマンスペナルティ"を受け入れ、ソースコードを変更しないでください。単純なオーバーヘッドよりもずっと悪いです。あなたがテストしているものが正当なコードであることを決して確かめることはできません。さらに、誰かがソースコードを修正する瞬間に、テストを中断させる可能性もあります。また、予期しない方法で(問題を捕らえることはできません)。

+0

ありがとうございました。私はすべてのあなたの言葉を考えます。私はユニ・テストのために非常に新しいです。だから私はこれを求めていた。それでよかった。私は自分のソースコードをモジュール化し、単体テストの生活を楽にするよう努めます。これがより良い選択であることを願っています。 –

0

あなたは、インポートするソースコードを変更することなく、テストケース内のコードの特定の部分を '模擬'することができます。

>>> def foo(): 
...  return 'bar' 
... 
>>> foo() 
'bar' 
>>> from unittest.mock import MagicMock 
>>> placeholder = foo 
>>> foo = MagicMock(return_value='bat') 
>>> foo() 
'bat' 
>>> foo = placeholder 
>>> foo() 
'bar' 
>>> 

mocking HTTP呼び出し(REST APIなど)には、たくさんの模擬ツールがあります。ここには良いスタートがあります:https://blog.fugue.co/2016-02-11-python-mocking-101.html

+0

私はモックを聞いたことがありません。どうもありがとう。これは非常に有益です。 –

+0

ところで、これはunittestのもののようです。 pytestにこれに類似したものはありますか?それ以外の場合は、unittestがPythonでビルドされているので、unittestもインポートします。しかし、これは私のソースコードの一部を実行できないようにするにはどうすればよいでしょうか? –

+0

https://pypi.python.org/pypi/pytest-mock/1.2にpytest.mockがありますが、試していません。スキップコードの実行に関しては、foo()は、インポートしたソースコードから実行をスキップしたいAPIです。しかし、ソースコードのいくつかの部分はfoo()を使用します。 foo()のいくつかの事前定義された戻り値で置き換えられるようにしたいと思います。 MagicMockはそれを手助けすることができます。 – Sharad

関連する問題