linuxBean14.04(166)noseでテストをする

ラベル: ,
faif/python-patternsの.travis.ymlが何なのか調べていると、そのなかでnodestestsというコマンドでPythonのテストを走らせていることを知りました。まずローカル環境でテストが走るのか確認することにします。

前の関連記事:linuxBean14.04(165)faif/python-patternsでデザインパターンの学習


noseはAnacondaのものを使う


Synapticパッケージマネージャからpython-noseで検索すると1.3.1がでてきてインストールするとnodetestsが使えるようになりましたが、linuxBean14.04(150)AnacondaとJupyter NotebookとLibreOffice5.2(失敗編)でインストールしたAnaconda 4.3.1にすでにインストールされていたのでそちらの方を使うことにしました。

faif/python-patternsでデザインパターンの学習で、デザインパターンの例をsrcフォルダに移動させたフォルダ構成で、srcフォルダで端末を起動します。
pq@pq-VirtualBox:~/git/python-patterns/python-patterns/src$ . ~/ana
pq@pq-VirtualBox:~/git/python-patterns/python-patterns/src$ python3 -V
Python 3.6.0 :: Anaconda custom (32-bit)
pq@pq-VirtualBox:~/git/python-patterns/python-patterns/src$ conda list nose
# packages in environment at /home/pq/anaconda3:
#
nose                      1.3.7                    py36_1  
noseの1.3.7がインストールされていることがわかりました。

最初に使っている. ~/anaというコマンドはlinuxBean14.04(115)pythonコマンドをpipコマンドとともに切り替えるで作成したAnacondaを有効にするシェルスクリプトです。

noseはnose2がでていますが、conda search nose2ではパッケージはでてきませんでした。

coveralls、codecov、flake8


.travis.ymlを読むとcoverallsとcodecov、flake8というパッケージもインストールしているのでこれらについても確認しましたがこれらはインストールされていませんでした。

conda searchでこれらのパッケージを検索してみたところflake8だけあったのでとりあえずそれをインストールしました。
(結局flake8はアンイストールしました。)

conda install flake8
pq@pq-VirtualBox:~/git/python-patterns/python-patterns/src$ conda install flake8
Fetching package metadata .........
Solving package specifications: .

Package plan for installation in environment /home/pq/anaconda3:

The following NEW packages will be INSTALLED:

    flake8:      3.3.0-py36_0 
    mccabe:      0.6.1-py36_0 
    pycodestyle: 2.3.1-py36_0 

The following packages will be UPDATED:

    conda:       4.3.14-py36_0 --> 4.3.16-py36_0

Proceed ([y]/n)? 
Flake8 — flake8 2.0 documentationとははじめに — pep8-ja 1.0 ドキュメントに従っているかコードをチェックするものです。

pip install coveralls
pip install codecov


coverallsもcodecovも:: Anaconda Cloudには64bit版しかなかったので、これらはpipでインストールしました。
(あとで判明しますがこれらをローカルにインストールする必要性はなく、結局アンイストールしました。)
pq@pq-VirtualBox:~/git/python-patterns/python-patterns/src$ pip install coveralls
Collecting coveralls
  Downloading coveralls-1.1-py2.py3-none-any.whl
Requirement already satisfied: requests>=1.0.0 in /home/pq/anaconda3/lib/python3.6/site-packages (from coveralls)
Collecting coverage>=3.6 (from coveralls)
  Downloading coverage-4.3.4-cp36-cp36m-manylinux1_i686.whl (189kB)
    100% |████████████████████████████████| 194kB 44kB/s 
Collecting docopt>=0.6.1 (from coveralls)
  Downloading docopt-0.6.2.tar.gz
Building wheels for collected packages: docopt
  Running setup.py bdist_wheel for docopt ... done
  Stored in directory: /home/pq/.cache/pip/wheels/b2/16/5f/c33a2bb5f2dce71205f8e65cbfd05647d79d441282be31fd82
Successfully built docopt
Installing collected packages: coverage, docopt, coveralls
Successfully installed coverage-4.3.4 coveralls-1.1 docopt-0.6.2
pq@pq-VirtualBox:~/git/python-patterns/python-patterns/src$ pip install codecov
Collecting codecov
  Downloading codecov-2.0.7-py2.py3-none-any.whl
Requirement already satisfied: coverage in /home/pq/anaconda3/lib/python3.6/site-packages (from codecov)
Requirement already satisfied: requests>=2.7.9 in /home/pq/anaconda3/lib/python3.6/site-packages (from codecov)
Installing collected packages: codecov
Successfully installed codecov-2.0.7
coverallsは1.1、codecovは2.0.7がインストールされました。 coverallsもcodecovもともにテストのコード網羅率を表示するようですが、 faif/python-patternsでは2つとも使っていますので2つともインストールしました。
(先にも書いたように結局アンインストールしました。)

コード網羅率 - Wikipediaを読むまでは文網羅しか思いつきませんでしたが、 文網羅以外にも分岐網羅とか条件網羅とかいっぱいあります。

nosetestsのオプション


PYTHONPATH=. nosetests -s -v --with-doctest --with-cov --cover-package . --logging-level=INFO -v .

.travis.ymlファイルにあるこのコマンドをsrcフォルダで実行するとテストはすべてパスしたようです。

.coverageというテキストファイルが出力されましたが、これはcoverage.pyが出力したもので直接読むなと書いてあります。

nosetests -h

これでnosetestsのヘルプが出力されました。
Usage: nosetests [options]
Options:
  -s, --nocapture       Don't capture stdout (any stdout output will be printed immediately) [NOSE_NOCAPTURE]
  -v, --verbose         Be more verbose. [NOSE_VERBOSE]
  --with-doctest        Enable plugin Doctest:  Activate doctest plugin to find and run doctests in non-test modules. [NOSE_WITH_DOCTEST]
  --cover-package=PACKAGE
                        Restrict coverage output to selected packages [NOSE_COVER_PACKAGE]
  --logging-level=LOGCAPTURE_LEVEL
                        Set the log level to capture
  --with-coverage       Enable plugin Coverage:  Activate a coverage report using Ned Batchelder's coverage module. [NOSE_WITH_COVERAGE]
関係ありそうなところだけ抜粋してみましたが、--with-covというオプションはなくて代りに--with-coverageというオプションのヘルプがありました。

引数はなくてもカレントフォルダからtestで始まるテストファイルを検索してテストしてくれるようです。

とりあえず一つずつオプションを実行して確認してみました。

オプションなしではテストの数とOKと表示されるだけです。

-sを付けるとテストの実行結果が出力されるようです、、、printの結果だけ?

-vを付けるとチェックしたテスト名一覧が出力されます。

--with-doctestを付けるとdoctestもテストされて、走らせたテストが98個から101個に増えました。

 --with-covを付けるとCover=Stmts/Miss*100の一覧が出力されました。

__init__.pyがそのフォルダ名で出力されていますね。

--with-coverageも同じことのようです。

Anacondaにはデフォルトでcoverage(4.3.4)がインストールされていました。

これをアンインストールすると--with-covも反応しなくなりました。

--cover-packageは引数を一つ要求してきます。

引数に.を付けると実行できました。

--cover-packageを付けると--with-covの結果で__init__.pyがそのままの名前で出力されました。

--logging-level=INFOはnosetestsの後ろに-vをつけてかつ、--logging-level=INFOの後ろに-vを付けたときのみその関連の出力がされました。

最初のPYTHONPATH=.は環境変数PYTHONPATHにカレントディレトリのパスを代入しているのですが、このPYTHONPATHの意味が私にはいまだにわからないし、なくても結果は変わらないようにみえます。

PYTHONPATHを設定してからsys.pathでみてもそのパスは出てきませんし。

export PYTHONPATHとしても同じ結果です。

 --cover-branchesで分岐網羅率も出力する


--cover-branchesで分離網羅率も出力されるようなのでやってみたら、coverage.misc.CoverageException: Can't add arcs to existing line dataというエラーがでてきました。

ned / coverage.py / 課題 / #476 - CoverageException: Can't add arcs to existing line data — Bitbucket

 --cover-eraseを付けてcoverageのデータをリセットすると解決するとのことなのでやってみたらうまくいきました。

nosetests --with-doctest --with-cov  --cover-erase --cover-branches --cover-package .
pq@pq-VirtualBox:~/git/python-patterns/python-patterns/src$ nosetests --with-doctest --with-cov  --cover-erase --cover-branches --cover-package .
.....................................................................................................
Name                                  Stmts   Miss Branch BrPart  Cover
-----------------------------------------------------------------------
behavioral/__init__.py                    0      0      0      0   100%
behavioral/catalog.py                    66     30     10      2    50%
behavioral/chain.py                      99     66     20      1    29%
略
-----------------------------------------------------------------------
TOTAL                                  2430    781    306     44    64%
----------------------------------------------------------------------
Ran 101 tests in 3.904s

OK
結果は途中略しています。

StmtsとMissは文網羅率のときと同じ表示です。
pq@pq-VirtualBox:~/git/python-patterns/python-patterns/src$ nosetests --with-doctest --with-cov  --cover-erase --cover-package ...
...................................................................................................
Name                                  Stmts   Miss  Cover
---------------------------------------------------------
behavioral/__init__.py                    0      0   100%
behavioral/catalog.py                    66     30    55%
behavioral/chain.py                      99     66    33%
略
---------------------------------------------------------
TOTAL                                  2430    781    68%
----------------------------------------------------------------------
Ran 101 tests in 3.912s

OK
文網羅率のときはこのようにMiss/Stmts*100でしたが、分岐網羅率のときはどうやって算出しているのでしょう?
論理分岐は真と偽の2つなので、コード中の分岐の総数を分母として、そのうちテスト実施(設計)したの数の総和を分子に計算を行うとブランチカバレッジ(%)が得られる。
情報システム用語事典:ブランチカバレッジ(ぶらんちかばれっじ) - ITmedia エンタープライズ
うーん、これを読んでも算出根拠はよくわかりませんでした。

coverallsはTravis CI経由でしか使えずアンイストール

pq@pq-VirtualBox:~/git/python-patterns/python-patterns/src$ coveralls -h
Publish coverage results online via coveralls.io

Puts your coverage results on coveralls.io for everyone to see.
It makes custom report for data generated by coverage.py package and sends it to `json API`_ of coveralls.io service.
All python files in your coverage analysis are posted to this service along with coverage stats,
so please make sure you're not ruining your own security!

Usage:
    coveralls [options]
    coveralls debug  [options]

    Debug mode doesn't send anything, just outputs json to stdout, useful for development.
    It also forces verbose output.

Global options:
    --rcfile=<file>   Specify configuration file. [default: .coveragerc]
    --output=<file>   Write report to file.  Doesn't send anything.
    --merge=<file>    Merge report from file when submitting.
    -h --help         Display this help
    -v --verbose      Print extra info, True for debug command

Example:
    $ coveralls
    Submitting coverage to coveralls.io...
    Coverage submitted!
    Job #38.1
    https://coveralls.io/jobs/92059
coverallsはcoveralls.ioに網羅率をアップロードするためのツールです。

しかしcoverallsを実行してみるとトークンを取得するかTravis CI経由で実行するように言われるだけです。

ということでローカルでインストールする意味はなさそうなのでアンインストールしました。

codecovもアンイストール

pq@pq-VirtualBox:~/git/python-patterns/python-patterns/src$ codecov -h
usage: codecov [-h] [--version] [--token TOKEN] [--file [FILE [FILE ...]]]
               [--flags [FLAGS [FLAGS ...]]] [--env [ENV [ENV ...]]]
               [--required] [--name NAME] [--gcov-root GCOV_ROOT]
               [--gcov-glob [GCOV_GLOB [GCOV_GLOB ...]]]
               [--gcov-exec GCOV_EXEC] [--gcov-args GCOV_ARGS]
               [-X [DISABLE [DISABLE ...]]] [--root ROOT] [--commit COMMIT]
               [--branch BRANCH] [--build BUILD] [--pr PR] [--tag TAG]
               [--slug SLUG] [--url URL] [--cacert CACERT] [--dump] [-v]
               [--no-color]

optional arguments:
  -h, --help            show this help message and exit

======================== Basics ========================:
  --version             show program's version number and exit
  --token TOKEN, -t TOKEN
                        Private repository token or @filename for file
                        containing the token. Defaults to $CODECOV_TOKEN. Not
                        required for public repositories on Travis-CI,
                        CircleCI and AppVeyor
  --file [FILE [FILE ...]], -f [FILE [FILE ...]]
                        Target a specific file for uploading
  --flags [FLAGS [FLAGS ...]], -F [FLAGS [FLAGS ...]]
                        Flag these uploaded files with custom labels
  --env [ENV [ENV ...]], -e [ENV [ENV ...]]
                        Store environment variables to help distinguish CI
                        builds.
  --required            If Codecov fails it will exit 1: failing the CI build.
  --name NAME, -n NAME  Custom defined name of the upload. Visible in Codecov
                        UI.

======================== gcov ========================:
  --gcov-root GCOV_ROOT
                        Project root directory when preparing gcov
  --gcov-glob [GCOV_GLOB [GCOV_GLOB ...]]
                        Paths to ignore during gcov gathering
  --gcov-exec GCOV_EXEC
                        gcov executable to run. Defaults to 'gcov'
  --gcov-args GCOV_ARGS
                        extra arguments to pass to gcov

======================== Advanced ========================:
  -X [DISABLE [DISABLE ...]], --disable [DISABLE [DISABLE ...]]
                        Disable features. Accepting **search** to disable
                        crawling through directories, **detect** to disable
                        detecting CI provider, **gcov** disable gcov commands,
                        `pycov` disables running python `coverage xml`,
                        **fix** to disable report adjustments
                        http://bit.ly/1O4eBpt
  --root ROOT           Project directory. Default: current direcory or
                        provided in CI environment variables
  --commit COMMIT, -c COMMIT
                        Commit sha, set automatically
  --branch BRANCH, -b BRANCH
                        Branch name
  --build BUILD         Specify a custom build number to distinguish ci jobs,
                        provided automatically for supported ci companies
  --pr PR               Specify a custom pr number, provided automatically for
                        supported ci companies
  --tag TAG             Git tag

======================== Enterprise ========================:
  --slug SLUG, -r SLUG  Specify repository slug for Enterprise ex. owner/repo
  --url URL, -u URL     Your Codecov endpoint
  --cacert CACERT       Certificate pem bundle used to verify with your
                        Codecov instance

======================== Debugging ========================:
  --dump                Dump collected data and do not send to Codecov
  -v, --verbose         No comfigured yet
  --no-color            Do not output with color

Upload reports to Codecov
codecovもcoverallsと同じでトークンを取得しないとローカルでは何もできないのでアンインストールしました。

flake8もアンインストール


flake8を実行するとたくさんの指摘を受けます。

faif/python-patternsの.travis.ymlではflake8 *pyというコマンドになっていますが、flake8 *pyでもflake8 *.pyでも何も出力されませんでした。

これも使うことはなさそうなのでアンインストールしました。

参考にしたサイト


GitHub - faif/python-patterns: A collection of design patterns/idioms in Python
Pythonのデザインパターンの例集。

GitHub - nose-devs/nose2: The successor to nose, based on unittest2
nose2はAnacondaパッケージにはまだありませんでした。

Flake8 — flake8 2.0 documentation
flake8の解説。

はじめに — pep8-ja 1.0 ドキュメント
flake8はこのコーディング規約をチェックしているようです。

:: Anaconda Cloud
Anacondaのパッケージ検索サイト。

コード網羅率 - Wikipedia
コード網羅率の解説。

ned / coverage.py / 課題 / #476 - CoverageException: Can't add arcs to existing line data — Bitbucket
--cover-branchesは--cover-eraseと一緒に使う必要がありました。

情報システム用語事典:ブランチカバレッジ(ぶらんちかばれっじ) - ITmedia エンタープライズ
分岐網羅の解説。テストした分岐/分岐の総数*100、が分岐網羅率となっています。

次の関連記事:linuxBean14.04(167)Travis CIでビルドできるように.travis.ymlを編集

PR

0 件のコメント:

コメントを投稿