Commits

Atsushi Odagiri  committed bf6b282

finish

  • Participants
  • Parent commits 2222c03

Comments (0)

Files changed (2)

File docs/index.rst

 ------------------------------
 
 - ユニットテスト
-- 機能テスト
+- ダミーやモックの使い方
 - カバレージとか
-- jenkins
 
 準備
 -----------------------------
 
+ツール
+++++++++++++++++++++++
+
 .. code-block:: bash
 
  $ pip install nose
- $ pip install webtest
- $ pip install 
+ $ pip install mock
+ $ pip install coverage
+
    
+テスト対象
+++++++++++++++++++++++
+
+好きな方法で取得
+
+- https://bitbucket.org/aodag/aodag.tasks を mercurial で cloneする。
+- https://bitbucket.org/aodag/aodag.tasks/get/tip.zip から zipファイルでダウンロードする。
 
 ユニットテスト
 -----------------------------
+
+ユニットテストの実行方法
++++++++++++++++++++++++++++++++
+
+.. code-block:: bash
+
+ $ nosetests
+
+setup.cfg にオプション設定してあるため、 doctest も実行されます。
+
+.. code-block:: ini
+
+ [nosetests]
+ with-doctest = 1
+
+カバレージを測る
++++++++++++++++++++++++++++++
+
+noseはcoverageを利用できるプラグインを同梱しています。
+``--with-covarage`` オプションでカバレージ測定を有効にできます。
+``--cover-package`` オプションで測定対象を設定できます。
+
+.. code-block:: bash
+
+ $ nosetests --with-coverage --cover-package=aodag.tasks
+
+毎回指定するのが面倒であれば、 setup.cfg にオプションを指定します。
+
+.. code-block:: ini
+
+  [nosetests]
+  with-covarge = 1
+  cover-package = aodag.tasks
+
+ダミーを使う
++++++++++++++++++++++++++
+
+たとえば ``ArgumentParser.parse_arg`` の結果を使う関数のテストをする場合に、
+わざわざ parse_arg を呼ぶ必要はありません。
+
+以下のようなダミーを渡してあげれば十分です。
+
+.. code-block:: python
+
+ class DummyArgs(object):
+     def __init__(self, **kwargs):
+         for name, value in kwargs.items():
+             setattr(self, name, value)
+
+
+mock の使い方
++++++++++++++++++++++++++++
+
+``input`` 関数や ``datetime.now`` などは、実行ごとに結果が変わります。
+mockを使って、決まった内容を返させるようにします。
+
+.. code-block:: python
+
+  @mock.patch('test_under_the_module.datetime'):
+  def test_it(mock_datetime):
+      mock_datetime.now.return_value = datetime(2012, 3, 17)
+
+      # some test
+
+.. code-block:: python
+
+  @mock.patch('test_under_the_module.input'):
+  def test_it(mock_input):
+      mock_input.side_effect = ['first input', 'second input']
+
+      # some test
+
+
+課題
+--------------------
+
+- `aodag.tasks` は Python3用に書かれています。Python2で動くように修正してください。
+- aodag/tasks/tests.py を追加して、 unittest のテストケースにしてください。
+- coverage を 100% にしてください。
+
+
+おまけ
+--------------------
+
+参考
+++++++++++++++++++++
+
+- `Avoiding Temptation: Notes on using 'unittest' effectively <http://palladion.com/home/tseaver/obzervationz/2008/unit_testing_notes-20080724>`_
+
+テストのひながた
+++++++++++++++++++++++++++++++++++++
+
+.. code-block:: python
+
+ import unittest
+
+ class SampleTests(unittest.TestCase):
+
+     def _callFUT(self, *args, **kwargs):
+         from module_under_the_test import function_under_the_test
+         return function_under_the_test(*args, **kwargs)
+
+     def test_it(self):
+         result = self._callFUT()
+         self.assertTrue(result)
+
 from setuptools import setup, find_packages
 
+requires = [
+    "webob",
+    "webdispatch",
+    "mako",
+    "sqlahelper",
+    "alembic",
+    "repoze.tm2",
+    "pastedeploy",
+    "pastescript",
+    "docutils",
+    "formencode",
+    "webhelpers",
+    "repoze.who",
+    "fanstatic",
+    "js.bootstrap",
+    "waitress",
+    "zope.dottedname",
+]
+
 setup(
-    name="pyfes_testing",
+    name="aodag.wiki",
     packages=find_packages(),
+    install_requires=requires,
+    namespace_packages=['aodag'],
 )