<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>skip と xfail: 成功しないテストを扱う</title> <link rel="stylesheet" href="_static/sphinxdoc.css" type="text/css" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> <script type="text/javascript"> var DOCUMENTATION_OPTIONS = { URL_ROOT: '', VERSION: '2.2.4.0', COLLAPSE_INDEX: false, FILE_SUFFIX: '.html', HAS_SOURCE: true }; </script> <script type="text/javascript" src="_static/jquery.js"></script> <script type="text/javascript" src="_static/underscore.js"></script> <script type="text/javascript" src="_static/doctools.js"></script> <script type="text/javascript" src="_static/translations.js"></script> <link rel="top" title="None" href="index.html" /> <link rel="up" title="py.test リファレンスドキュメント" href="apiref.html" /> <link rel="next" title="属性をもつテスト関数のマーク" href="mark.html" /> <link rel="prev" title="一時ディレクトリとファイル" href="tmpdir.html" /> </head> <body> <div class="related"> <h3>ナビゲーション</h3> <ul> <li class="right" style="margin-right: 10px"> <a href="py-modindex.html" title="Pythonモジュール索引" >モジュール</a></li> <li class="right" > <a href="mark.html" title="属性をもつテスト関数のマーク" accesskey="N">次へ</a> |</li> <li class="right" > <a href="tmpdir.html" title="一時ディレクトリとファイル" accesskey="P">前へ</a> |</li> <li><a href="contents.html">pytest-2.2.4.0</a> »</li> <li><a href="apiref.html" accesskey="U">py.test リファレンスドキュメント</a> »</li> </ul> </div> <div class="sphinxsidebar"> <div class="sphinxsidebarwrapper"> <h3><a href="contents.html">目次</a></h3> <ul> <li><a class="reference internal" href="#">skip と xfail: 成功しないテストを扱う</a><ul> <li><a class="reference internal" href="#skipif">スキップするテスト関数のマーク</a></li> <li><a class="reference internal" href="#id2">クラスの全テスト関数のスキップ</a></li> <li><a class="reference internal" href="#xfail">失敗を期待するテスト関数のマーク</a></li> <li><a class="reference internal" href="#skipif-xfail">skipif/xfail 式の評価</a></li> <li><a class="reference internal" href="#setup-xfail">テスト関数または setup 関数内から命令型 xfail</a></li> <li><a class="reference internal" href="#id5">インポートの依存関係の欠落をスキップ</a></li> <li><a class="reference internal" href="#setup">テスト関数または setup 関数内から命令型スキップ</a></li> </ul> </li> </ul> <h4>前のトピックへ</h4> <p class="topless"><a href="tmpdir.html" title="前の章へ">一時ディレクトリとファイル</a></p> <h4>次のトピックへ</h4> <p class="topless"><a href="mark.html" title="次の章へ">属性をもつテスト関数のマーク</a></p> <div id="searchbox" style="display: none"> <h3>クイック検索</h3> <form class="search" action="search.html" method="get"> <input type="text" name="q" /> <input type="submit" value="検索" /> <input type="hidden" name="check_keywords" value="yes" /> <input type="hidden" name="area" value="default" /> </form> <p class="searchtip" style="font-size: 90%"> モジュール、クラス、または関数名を入力してください </p> </div> <script type="text/javascript">$('#searchbox').show(0);</script> </div> </div> <div class="document"> <div class="documentwrapper"> <div class="bodywrapper"> <div class="body"> <div class="section" id="skip-xfail"> <span id="skip-and-xfail"></span><h1>skip と xfail: 成功しないテストを扱う<a class="headerlink" href="#skip-xfail" title="このヘッドラインへのパーマリンク">¶</a></h1> <p>テスト関数が、特定のプラットフォームで実行できない、またはマークしたものが失敗することを期待する、またはテスト関数や setup 関数の実行中にヘルパー関数を呼び出すといった場合があります。</p> <p><em>skip</em> は、特定の設定や条件 (誤った Python インタープリターや依存関係の欠落など) がテスト関数を実行させない場合を除けば、テストが成功するのを期待します。 <em>xfail</em> は、テストそのものは実行しますが、実装上の問題からそのテストが失敗することを期待します。</p> <p>py.test は <em>skip</em> と <em>xfail</em> テストを別々に数えて一覧表示します。しかし、スキップした/失敗したテストテストについての詳細な情報は、出力内容がごちゃごちゃにならないようにデフォルトでは表示されません。テストの進捗状況を表示する “短い” 文字に対応する詳細を見るために <tt class="docutils literal"><span class="pre">-r</span></tt> オプションが使えます:</p> <div class="highlight-python"><div class="highlight"><pre><span class="n">py</span><span class="o">.</span><span class="n">test</span> <span class="o">-</span><span class="n">rxs</span> <span class="c"># skips と xfails の補足情報を表示</span> </pre></div> </div> <p>(<a class="reference internal" href="customize.html#how-to-change-command-line-options-defaults"><em>コマンドラインオプションのデフォルト値の変更方法</em></a> を参照)</p> <div class="section" id="skipif"> <span id="id1"></span><h2>スキップするテスト関数のマーク<a class="headerlink" href="#skipif" title="このヘッドラインへのパーマリンク">¶</a></h2> <p>Python 3 インタープリターで実行するときにスキップするテスト関数をマークする例を紹介します:</p> <div class="highlight-python"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">sys</span> <span class="nd">@pytest.mark.skipif</span><span class="p">(</span><span class="s">"sys.version_info >= (3,0)"</span><span class="p">)</span> <span class="k">def</span> <span class="nf">test_function</span><span class="p">():</span> <span class="o">...</span> </pre></div> </div> <p>テスト関数の setup 処理中に skipif の条件が <tt class="docutils literal"><span class="pre">eval('sys.version_info</span> <span class="pre">>=</span> <span class="pre">(3,0)',</span> <span class="pre">namespace)</span></tt> を呼び出すことにより評価されます (<em>バージョン 2.0.2 で追加</em>) 。その名前空間は、例えば使っているモジュールのバージョンをチェックできるように、テスト関数の全モジュールの globals を含みます:</p> <div class="highlight-python"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">mymodule</span> <span class="nd">@pytest.mark.skipif</span><span class="p">(</span><span class="s">"mymodule.__version__ < '1.2'"</span><span class="p">)</span> <span class="k">def</span> <span class="nf">test_function</span><span class="p">():</span> <span class="o">...</span> </pre></div> </div> <p>このテスト関数は、 <tt class="docutils literal"><span class="pre">mymodule</span></tt> が指定したバージョンより低いときには実行されません (“スキップされる”) 。こういった条件を文字列で指定する主な理由は、py.test が skip 条件の概要をレポートできるからです。 <tt class="docutils literal"><span class="pre">namespace</span></tt> の構築に関する詳細は <a class="reference internal" href="#evaluation-of-skipif-xfail-conditions"><em>skipif/xfail 式の評価</em></a> を参照してください。</p> <p>次のようにモジュールレベルで条件付きの skipif デコレーターのショートカットも作成できます:</p> <div class="highlight-python"><div class="highlight"><pre><span class="n">win32only</span> <span class="o">=</span> <span class="n">pytest</span><span class="o">.</span><span class="n">mark</span><span class="o">.</span><span class="n">skipif</span><span class="p">(</span><span class="s">"sys.platform != 'win32'"</span><span class="p">)</span> <span class="nd">@win32only</span> <span class="k">def</span> <span class="nf">test_function</span><span class="p">():</span> <span class="o">...</span> </pre></div> </div> </div> <div class="section" id="id2"> <h2>クラスの全テスト関数のスキップ<a class="headerlink" href="#id2" title="このヘッドラインへのパーマリンク">¶</a></h2> <p>全ての関数を <a class="reference internal" href="mark.html#mark"><em>マークする</em></a> のと同様に <a class="reference external" href="mark.html#scoped-marking">クラス全体またはモジュールレベル</a> でテスト関数をスキップできます。プラットフォームによりテストクラスの全メソッドをスキップするサンプルを紹介します:</p> <div class="highlight-python"><div class="highlight"><pre><span class="k">class</span> <span class="nc">TestPosixCalls</span><span class="p">:</span> <span class="n">pytestmark</span> <span class="o">=</span> <span class="n">pytest</span><span class="o">.</span><span class="n">mark</span><span class="o">.</span><span class="n">skipif</span><span class="p">(</span><span class="s">"sys.platform == 'win32'"</span><span class="p">)</span> <span class="k">def</span> <span class="nf">test_function</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="s">"will not be setup or run under 'win32' platform"</span> </pre></div> </div> <p><tt class="docutils literal"><span class="pre">pytestmark</span></tt> という特別な名前を使って、クラス内の各テスト関数へセットした関数を pytest に適用させます。テストコードが Python 2.6 以上を想定しているなら、もっと自然に skipif デコレーター (その他の任意のマーカー) をクラスに対して適用できます:</p> <div class="highlight-python"><div class="highlight"><pre><span class="nd">@pytest.mark.skipif</span><span class="p">(</span><span class="s">"sys.platform == 'win32'"</span><span class="p">)</span> <span class="k">class</span> <span class="nc">TestPosixCalls</span><span class="p">:</span> <span class="k">def</span> <span class="nf">test_function</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="s">"will not be setup or run under 'win32' platform"</span> </pre></div> </div> <p>1つの関数に複数の “skipif” デコレーターを使うことは一般的に良いことです。いずれかの条件が適用された場合にそのテスト関数の実行はスキップされることになります。</p> </div> <div class="section" id="xfail"> <span id="id4"></span><h2>失敗を期待するテスト関数のマーク<a class="headerlink" href="#xfail" title="このヘッドラインへのパーマリンク">¶</a></h2> <p>テストの失敗を期待していることを表すのに <tt class="docutils literal"><span class="pre">xfail</span></tt> マーカーを使います:</p> <div class="highlight-python"><div class="highlight"><pre><span class="nd">@pytest.mark.xfail</span> <span class="k">def</span> <span class="nf">test_function</span><span class="p">():</span> <span class="o">...</span> </pre></div> </div> <p>このテストは実行されますが、失敗するときにトレースバックを表示しません。その代わり、ターミナル上に “expected to fail” か “unexpectedly passing” セクションにその一覧が表示されます。</p> <p>コマンドラインで次のように指定すると:</p> <div class="highlight-python"><div class="highlight"><pre><span class="n">pytest</span> <span class="o">--</span><span class="n">runxfail</span> </pre></div> </div> <p><tt class="docutils literal"><span class="pre">xfail</span></tt> でマークされていないかのように <tt class="docutils literal"><span class="pre">xfail</span></tt> でマークされたテスト関数を実行してレポートの表示を強制できます。</p> <p><a class="reference internal" href="#skipif">skipif</a> と同様に、特定のプラットフォームでの失敗を期待するようにもマークできます:</p> <div class="highlight-python"><div class="highlight"><pre><span class="nd">@pytest.mark.xfail</span><span class="p">(</span><span class="s">"sys.version_info >= (3,0)"</span><span class="p">)</span> <span class="k">def</span> <span class="nf">test_function</span><span class="p">():</span> <span class="o">...</span> </pre></div> </div> <p>さらに、バグ ID といった reason を指定して “xfail” テストを実行しないようにもできます。他にも使用例と簡単なテストを紹介します:</p> <div class="highlight-python"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">pytest</span> <span class="n">xfail</span> <span class="o">=</span> <span class="n">pytest</span><span class="o">.</span><span class="n">mark</span><span class="o">.</span><span class="n">xfail</span> <span class="nd">@xfail</span> <span class="k">def</span> <span class="nf">test_hello</span><span class="p">():</span> <span class="k">assert</span> <span class="mi">0</span> <span class="nd">@xfail</span><span class="p">(</span><span class="n">run</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span> <span class="k">def</span> <span class="nf">test_hello2</span><span class="p">():</span> <span class="k">assert</span> <span class="mi">0</span> <span class="nd">@xfail</span><span class="p">(</span><span class="s">"hasattr(os, 'sep')"</span><span class="p">)</span> <span class="k">def</span> <span class="nf">test_hello3</span><span class="p">():</span> <span class="k">assert</span> <span class="mi">0</span> <span class="nd">@xfail</span><span class="p">(</span><span class="n">reason</span><span class="o">=</span><span class="s">"bug 110"</span><span class="p">)</span> <span class="k">def</span> <span class="nf">test_hello4</span><span class="p">():</span> <span class="k">assert</span> <span class="mi">0</span> <span class="nd">@xfail</span><span class="p">(</span><span class="s">'pytest.__version__[0] != "17"'</span><span class="p">)</span> <span class="k">def</span> <span class="nf">test_hello5</span><span class="p">():</span> <span class="k">assert</span> <span class="mi">0</span> <span class="k">def</span> <span class="nf">test_hello6</span><span class="p">():</span> <span class="n">pytest</span><span class="o">.</span><span class="n">xfail</span><span class="p">(</span><span class="s">"reason"</span><span class="p">)</span> </pre></div> </div> <p>次のように xfail のレポートを表示するオプションを指定して実行します:</p> <div class="highlight-python"><pre>example $ py.test -rx xfail_demo.py =========================== test session starts ============================ platform linux2 -- Python 2.7.1 -- pytest-2.2.4 collecting ... collected 6 items xfail_demo.py xxxxxx ========================= short test summary info ========================== XFAIL xfail_demo.py::test_hello XFAIL xfail_demo.py::test_hello2 reason: [NOTRUN] XFAIL xfail_demo.py::test_hello3 condition: hasattr(os, 'sep') XFAIL xfail_demo.py::test_hello4 bug 110 XFAIL xfail_demo.py::test_hello5 condition: pytest.__version__[0] != "17" XFAIL xfail_demo.py::test_hello6 reason: reason ======================== 6 xfailed in 0.03 seconds =========================</pre> </div> </div> <div class="section" id="skipif-xfail"> <span id="evaluation-of-skipif-xfail-conditions"></span><h2>skipif/xfail 式の評価<a class="headerlink" href="#skipif-xfail" title="このヘッドラインへのパーマリンク">¶</a></h2> <p class="versionadded"> <span class="versionmodified">バージョン 2.0.2 で追加.</span></p> <p><tt class="docutils literal"><span class="pre">pytest.mark.skipif(conditionstring)</span></tt> または <tt class="docutils literal"><span class="pre">pytest.mark.xfail(conditionstring)</span></tt> の条件文字列の評価は、次のように構築された名前空間ディクショナリの中で行われます:</p> <ul class="simple"> <li><tt class="docutils literal"><span class="pre">sys</span></tt> と <tt class="docutils literal"><span class="pre">os</span></tt> モジュールと pytest の <tt class="docutils literal"><span class="pre">config</span></tt> オブジェクトを加えて名前空間が初期化される</li> </ul> <ul class="simple"> <li>その式の評価を適用するテスト関数のモジュールの globals が更新される</li> </ul> <p>pytest の <tt class="docutils literal"><span class="pre">config</span></tt> オブジェクトを使って、追加したテスト設定値によりスキップさせます:</p> <div class="highlight-python"><div class="highlight"><pre><span class="nd">@pytest.mark.skipif</span><span class="p">(</span><span class="s">"not config.getvalue('db')"</span><span class="p">)</span> <span class="k">def</span> <span class="nf">test_function</span><span class="p">(</span><span class="o">...</span><span class="p">):</span> <span class="o">...</span> </pre></div> </div> </div> <div class="section" id="setup-xfail"> <h2>テスト関数または setup 関数内から命令型 xfail<a class="headerlink" href="#setup-xfail" title="このヘッドラインへのパーマリンク">¶</a></h2> <p>インポート時に xfail の条件を宣言できない場合、テスト関数または setup コード内から xfail するように命令的に記述できます。サンプルを紹介します:</p> <div class="highlight-python"><div class="highlight"><pre><span class="k">def</span> <span class="nf">test_function</span><span class="p">():</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">valid_config</span><span class="p">():</span> <span class="n">pytest</span><span class="o">.</span><span class="n">xfail</span><span class="p">(</span><span class="s">"unsupported configuration"</span><span class="p">)</span> </pre></div> </div> </div> <div class="section" id="id5"> <h2>インポートの依存関係の欠落をスキップ<a class="headerlink" href="#id5" title="このヘッドラインへのパーマリンク">¶</a></h2> <p>モジュールレベル、またはテスト関数や setup 関数内から次のインポートヘルパーが使えます:</p> <div class="highlight-python"><div class="highlight"><pre><span class="n">docutils</span> <span class="o">=</span> <span class="n">pytest</span><span class="o">.</span><span class="n">importorskip</span><span class="p">(</span><span class="s">"docutils"</span><span class="p">)</span> </pre></div> </div> <p>もし <tt class="docutils literal"><span class="pre">docutils</span></tt> がこの場所でインポートできないなら、このテストはスキップされます。ライブラリのバージョンによりスキップさせることもできます:</p> <div class="highlight-python"><div class="highlight"><pre><span class="n">docutils</span> <span class="o">=</span> <span class="n">pytest</span><span class="o">.</span><span class="n">importorskip</span><span class="p">(</span><span class="s">"docutils"</span><span class="p">,</span> <span class="n">minversion</span><span class="o">=</span><span class="s">"0.3"</span><span class="p">)</span> </pre></div> </div> <p>このバージョンは指定したモジュールの <tt class="docutils literal"><span class="pre">__</span> <span class="pre">version__</span></tt> 属性から読み込まれます。</p> </div> <div class="section" id="setup"> <h2>テスト関数または setup 関数内から命令型スキップ<a class="headerlink" href="#setup" title="このヘッドラインへのパーマリンク">¶</a></h2> <p>何らかの理由でスキップ条件を宣言できない場合も、テスト関数または setup コード内からスキップするように命令的に記述できます。サンプルを紹介します:</p> <div class="highlight-python"><div class="highlight"><pre><span class="k">def</span> <span class="nf">test_function</span><span class="p">():</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">valid_config</span><span class="p">():</span> <span class="n">pytest</span><span class="o">.</span><span class="n">skip</span><span class="p">(</span><span class="s">"unsupported configuration"</span><span class="p">)</span> </pre></div> </div> </div> </div> </div> </div> </div> <div class="clearer"></div> </div> <div class="related"> <h3>ナビゲーション</h3> <ul> <li class="right" style="margin-right: 10px"> <a href="py-modindex.html" title="Pythonモジュール索引" >モジュール</a></li> <li class="right" > <a href="mark.html" title="属性をもつテスト関数のマーク" >次へ</a> |</li> <li class="right" > <a href="tmpdir.html" title="一時ディレクトリとファイル" >前へ</a> |</li> <li><a href="contents.html">pytest-2.2.4.0</a> »</li> <li><a href="apiref.html" >py.test リファレンスドキュメント</a> »</li> </ul> </div> <div class="footer"> © Copyright 2011, holger krekel et alii. このドキュメントは <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3 で生成しました。 </div> </body> </html>