Sophie

Sophie

distrib > Fedora > 18 > i386 > by-pkgid > 7f671eb35339cf812de52087b0d93519 > files > 396

python3-pytest-2.3.5-3.fc18.noarch.rpm



<!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>課題と質問</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="基本から始めよう" href="overview.html" />
    <link rel="next" title="使用方法と例" href="example/index.html" />
    <link rel="prev" title="プロジェクトの例" href="projects.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="example/index.html" title="使用方法と例"
             accesskey="N">次へ</a> |</li>
        <li class="right" >
          <a href="projects.html" title="プロジェクトの例"
             accesskey="P">前へ</a> |</li>
        <li><a href="contents.html">pytest-2.2.4.0</a> &raquo;</li>
          <li><a href="overview.html" accesskey="U">基本から始めよう</a> &raquo;</li> 
      </ul>
    </div>
      <div class="sphinxsidebar">
        <div class="sphinxsidebarwrapper">
  <h3><a href="contents.html">目次</a></h3>
  <ul>
<li><a class="reference internal" href="#">課題と質問</a><ul>
<li><a class="reference internal" href="#nosetests">名前付け、nosetests、ライセンスと魔法</a><ul>
<li><a class="reference internal" href="#pytest-py-test">どうしてコマンド名は <tt class="docutils literal"><span class="pre">pytest</span></tt> ではなく <tt class="docutils literal"><span class="pre">py.test</span></tt> なの?</a></li>
<li><a class="reference internal" href="#py-test-nose-unittest">py.test は nose や unittest とどんな関係があるの?</a></li>
<li><a class="reference internal" href="#py-test">py.test の &#8220;魔法&#8221; は一体何なの?</a></li>
</ul>
</li>
<li><a class="reference internal" href="#id2">関数の引数、パラメーターテストとセットアップ</a><ul>
<li><a class="reference internal" href="#funcarg-xunit">funcarg- 対 xUnit セットアップスタイルの疑問</a></li>
<li><a class="reference internal" href="#funcarg-pytest-funcarg">どうして funcarg ファクトリーの名前は <tt class="docutils literal"><span class="pre">pytest_funcarg__*</span></tt> なの?</a></li>
<li><a class="reference internal" href="#funcarg-yield">funcarg ファクトリー関数から複数の値を yield できますか?</a></li>
</ul>
</li>
<li><a class="reference internal" href="#id5">その他のパッケージと py.test の相互連携</a><ul>
<li><a class="reference internal" href="#py-test-multiprocess-setuptools">py.test, multiprocess, setuptools と関連する問題?</a></li>
</ul>
</li>
</ul>
</li>
</ul>

  <h4>前のトピックへ</h4>
  <p class="topless"><a href="projects.html"
                        title="前の章へ">プロジェクトの例</a></p>
  <h4>次のトピックへ</h4>
  <p class="topless"><a href="example/index.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="id1">
<h1>課題と質問<a class="headerlink" href="#id1" title="このヘッドラインへのパーマリンク">¶</a></h1>
<div class="admonition note">
<p class="first admonition-title">ノート</p>
<p class="last">ここで答えが見つからない場合は <a class="reference internal" href="contact.html#contact-channels"><em>連絡先</em></a> から助けを求めてください。</p>
</div>
<div class="section" id="nosetests">
<h2>名前付け、nosetests、ライセンスと魔法<a class="headerlink" href="#nosetests" title="このヘッドラインへのパーマリンク">¶</a></h2>
<div class="section" id="pytest-py-test">
<h3>どうしてコマンド名は <tt class="docutils literal"><span class="pre">pytest</span></tt> ではなく <tt class="docutils literal"><span class="pre">py.test</span></tt> なの?<a class="headerlink" href="#pytest-py-test" title="このヘッドラインへのパーマリンク">¶</a></h3>
<p>理由の一部は歴史的なもので、それ以外は実用上のものです。 <tt class="docutils literal"><span class="pre">py.test</span></tt> は、複数の開発者向けユーティリティを提供する <tt class="docutils literal"><span class="pre">py</span></tt> パッケージの一部として使われていました。それは全て <tt class="docutils literal"><span class="pre">py.&lt;TAB&gt;</span></tt> で始まり、このように &lt;TAB&gt; を補完する優れた機能を提供しています。 <tt class="docutils literal"><span class="pre">pip</span> <span class="pre">install</span> <span class="pre">pycmd</span></tt> でインストールしたら、別々のパッケージからそういったツールを確認できます。最近になって、コマンドラインツールは <tt class="docutils literal"><span class="pre">pytest</span></tt> と呼んでいますが、昔からの多くの人たちが古い名前になじんでいて &#8220;pytest&#8221; という名前は別ツールに思えます。そのため、我々は <tt class="docutils literal"><span class="pre">py.test</span></tt> という名前を使い続けることに決めました。</p>
</div>
<div class="section" id="py-test-nose-unittest">
<h3>py.test は nose や unittest とどんな関係があるの?<a class="headerlink" href="#py-test-nose-unittest" title="このヘッドラインへのパーマリンク">¶</a></h3>
<p>py.test と <a class="reference external" href="http://somethingaboutorange.com/mrl/projects/nose/">nose</a> は、Python テストを書いて実行するのに同じ基本理念をもっています。 <a class="reference external" href="http://somethingaboutorange.com/mrl/projects/nose/">nose</a> は、もともと <tt class="docutils literal"><span class="pre">py.test</span></tt> が <tt class="docutils literal"><span class="pre">0.8</span></tt> リリースのときに py.test のクローンとして作成されました。pytest 2.0 は unittest のテストスイートを実行できるようになったのが主な改善点であることに注目してください。そして、多くの Django や Twisted のテストスイートを変更せずに実行できます。</p>
</div>
<div class="section" id="py-test">
<h3>py.test の &#8220;魔法&#8221; は一体何なの?<a class="headerlink" href="#py-test" title="このヘッドラインへのパーマリンク">¶</a></h3>
<p>2007年頃 (バージョン <tt class="docutils literal"><span class="pre">0.8</span></tt>)、py.test はあまりにも多くの &#8220;魔法&#8221; を使っていると主張する人たちがいました。未使用なコード、非推奨、複雑なコードを削除することで部分的には解消されました。今日では、py.test は確かに Python 向けの最も小さく普遍的でカスタマイズ可能なテストフレームワークの1つです。但し <tt class="docutils literal"><span class="pre">py.test</span></tt> は、まだ多くのメタプログラミングテクニックを使っていて、Python 初心者がそのソースを読めるものではありません。</p>
<p>2番目の &#8220;魔法&#8221; の課題は、間違いなく assert 文のデバッグ機能です。テストモジュールが読み込まれると、py.test は assert 文のソースコードを書き換えます。書き換えられた assert 文が失敗したとき、そのエラーメッセージは、オリジナルの assert 文より分かりやすいものです。py.test にも別のデバッグ手法があります。書き換えが失敗することにより <tt class="docutils literal"><span class="pre">assert</span></tt> 文が失敗したとき、py.test はテストが失敗したときに中間値を表示するためにその式を再解釈します。この別のデバッグ手法は書き換えが行われなかったという警告で悩まされます。その式が副作用 (とにかく触らないのが良い!) をもつなら、中間値は同じにならない可能性があります。それは再解釈するインタープリターを混乱させ、初期のエラーを分かり難くします (これも発生したらコマンドラインで表示される) 。 <tt class="docutils literal"><span class="pre">py.test</span> <span class="pre">--assertmode=off</span></tt> により、全てのアサーションデバッグを無効にできます。</p>
</div>
</div>
<div class="section" id="id2">
<h2>関数の引数、パラメーターテストとセットアップ<a class="headerlink" href="#id2" title="このヘッドラインへのパーマリンク">¶</a></h2>
<div class="section" id="funcarg-xunit">
<h3>funcarg- 対 xUnit セットアップスタイルの疑問<a class="headerlink" href="#funcarg-xunit" title="このヘッドラインへのパーマリンク">¶</a></h3>
<p>シンプルなアプリケーション向けや、<a class="reference external" href="http://somethingaboutorange.com/mrl/projects/nose/">nose</a> か unittest スタイルの経験がある人たちにとっては、おそらく <a class="reference internal" href="xunit_setup.html#xunitsetup"><em>拡張された xUnit スタイルのセットアップフィクスチャ</em></a> を使う方が自然に感じるはずです。しかし、巨大なテストスイート向けでは、パラメーターテストや <a class="reference external" href="test/funcargs.html">funcargs</a> を使った複雑なテストリソースのセットアップの方がもっと自然に感じるかもしれません。さらに言うと、funcargs は高度なテストサポートコード (例えば <a class="reference external" href="test/plugin/monkeypatch.html">monkeypatch</a>, <a class="reference external" href="test/plugin/tmpdir.html">tmpdir</a>, <a class="reference external" href="test/plugin/capture.html">capture</a>, funcargs) を書くのに最適です。というのは、そのサポートコードは class/module/function スコープを管理する setup/teardown 関数を登録できるからです。</p>
</div>
<div class="section" id="funcarg-pytest-funcarg">
<span id="why-pytest-pyfuncarg-methods"></span><h3>どうして funcarg ファクトリーの名前は <tt class="docutils literal"><span class="pre">pytest_funcarg__*</span></tt> なの?<a class="headerlink" href="#funcarg-pytest-funcarg" title="このヘッドラインへのパーマリンク">¶</a></h3>
<p>我々は <a class="reference external" href="http://en.wikipedia.org/wiki/Convention_over_Configuration">設定より規約</a> を好み、より柔軟に抽象的な仕組みを許容するのに意味があるとは思いませんでした。さらに、ソースコード内で <tt class="docutils literal"><span class="pre">pytest_funcarg__MYARG</span></tt> を検索できるのは便利で、 <tt class="docutils literal"><span class="pre">MYARG</span></tt> という関数の引数に対する全てのファクトリー関数を戸惑いなく探せます。</p>
</div>
<div class="section" id="funcarg-yield">
<h3>funcarg ファクトリー関数から複数の値を yield できますか?<a class="headerlink" href="#funcarg-yield" title="このヘッドラインへのパーマリンク">¶</a></h3>
<p>ファクトリー関数が yield できない概念上の理由が2つあります:</p>
<ul class="simple">
<li>テスト関数の引数を取得するためにファクトリー関数を呼び出すのは、テストの設定と実行の部分です。その時点では、テストコレクションのために新たなテスト呼び出しを追加できません。</li>
</ul>
<ul class="simple">
<li>複数のファクトリー関数が値を yield した場合、組み合わせ方法を決定するのに適当な場所がありません。現実の世界の例は、そういった組み合わせが多くの場合に実行されません。</li>
</ul>
<p>両方の課題を解決するために <a class="reference external" href="test/funcargs.html#parametrizing-tests">pytest_generate_tests</a> フックを使い、 <a class="reference external" href="http://tetamap.wordpress.com/2009/05/13/parametrizing-python-tests-generalized/">パラメーター化の仕組みにあったものを選択して</a> 実装してください。</p>
</div>
</div>
<div class="section" id="id5">
<h2>その他のパッケージと py.test の相互連携<a class="headerlink" href="#id5" title="このヘッドラインへのパーマリンク">¶</a></h2>
<div class="section" id="py-test-multiprocess-setuptools">
<h3>py.test, multiprocess, setuptools と関連する問題?<a class="headerlink" href="#py-test-multiprocess-setuptools" title="このヘッドラインへのパーマリンク">¶</a></h3>
<p>Windows 上の multiprocess パッケージは、pickle 化することでサブプロセスをインスタンス化し、暗黙的にたくさんのローカルモジュールを再インポートします。残念ながら、setuptools 0.6.11 が作成したコマンドラインスクリプトは <tt class="docutils literal"><span class="pre">if</span> <span class="pre">__name__=='__main__'</span></tt> による保護がありません。これにより、実行中のテストがプロセスをインスタンス化するときに無限再帰を引き起こします。</p>
<p>良い解決策は、setuptools の置き換えとして <a class="reference external" href="http://pypi.python.org/pypi/distribute#installation-instructions">distribute をインストールする</a> ことです。その後に <tt class="docutils literal"><span class="pre">pytest</span></tt> を再インストールします。別の方法では、setuptools が作成したスクリプトに <tt class="docutils literal"><span class="pre">if</span> <span class="pre">__name__</span> <span class="pre">==</span> <span class="pre">'__main__'</span></tt> を追加して修正します。もしくは、この内容を含む &#8220;pytest.py&#8221; スクリプトを作成して、そのスクリプトを実行します:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">pytest</span>
<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&#39;__main__&#39;</span><span class="p">:</span>
    <span class="n">pytest</span><span class="o">.</span><span class="n">main</span><span class="p">()</span>
</pre></div>
</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="example/index.html" title="使用方法と例"
             >次へ</a> |</li>
        <li class="right" >
          <a href="projects.html" title="プロジェクトの例"
             >前へ</a> |</li>
        <li><a href="contents.html">pytest-2.2.4.0</a> &raquo;</li>
          <li><a href="overview.html" >基本から始めよう</a> &raquo;</li> 
      </ul>
    </div>
    <div class="footer">
        &copy; Copyright 2011, holger krekel et alii.
      このドキュメントは <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3 で生成しました。
    </div>
  </body>
</html>