今更ようやく。
成果物
Github.Uploader.SshConfigurator.unittest.201704221606
開発環境
- Linux Mint 17.3 MATE 32bit
- SQLite 3.8.2
- Python 3.4.3
前回まで
http://ytyaru.hatenablog.com/entry/2017/12/03/000000
SshConfigurator.py
SshConfigurator.py
は~/.ssh/config
ファイルにHostを追加、削除する。GitHubアカウントを登録するときにSSH鍵の設定を追加、更新、削除するときに使う。
単体テスト
python3 -m unittest TestSshConfigurator.py
バグ発見
__GetConfigTextNewHost関数
return append.format(Host=Host, IdentityFile=IdentityFile, Port=Port)
がなかったので追加した
作成時点からずっとこのバグを抱えていた。しかし今日まで単体テストしなかったため発見できなかった。
ユーザ登録でpython3 GitHubUserRegister.py insert
するとき、SSH自動生成する場合、正常に実行できずエラーになってしまっていた。
気を使う点
1. import
Pythonのunittestを使って単体テストをするとき、実行箇所がルートになる。ルートよりも上のパッケージやモジュールは参照できない。
単体テストをするときは、極力関連するパッケージやモジュールを排除してテストする。たとえば今回はログ出力web.log.Log
モジュールもimportしないようにした。
2. 順不同
テストの実行順が順不同。
別のテストメソッドで同一ファイルを操作するとき、順序が変わってもテスト内容や結果が変わらないようにする必要がある。
3. テストデータ
本番の~/.ssh/config
ファイルを壊さないようにする必要がある。今回はテスト用にtest_config
ファイルを用意した。
今後
今更だが少しずつテストしたい。しかし大変そう。
- 単体で動作するクラスが少ない
- 単体で動作するようにディレクトリ構成やコードを組み換えねばならない
単体で動作できそうなものは以下。
.cui/register/SshConfigurator.py
.cui/register/SshKeyGen.py
- `./web/sqlite/Json2Sqlite.py
./web/log/Log.py
./web/http/Response.py
./web/service/github/api/v3/AuthenticationsCreator.py
API、sqlite3、ターミナルなど外部の各文脈や仕様が関わる部分は、もはや単体テストではなく結合テストになるか。
./web/service/github/api/v3/RequestParameter.py
./web/service/github/api/v3/Response.py
- GitHubAPI一式
/web/service/github/api/v3/repositories/Repositories.py
など
- CUI
- 起動引数
./GitHubUserRegister.py
など
- バッチ系
./cui/register/command/Inserter.py
など
- 対話系
./cui/uploader/Main.py
など- 対話の部分はどうやってテストすればいいのか
- 起動引数
./database/src/...
などデータベース系はどうやってテストすればいいのか
単体テスト済み
/web/service/github/api/v3/authentication
は単体テスト済み。
- https://github.com/ytyaru/GitHub.API.Authentication.Abstract.201704141006
- http://ytyaru.hatenablog.com/entry/2017/11/29/000000
所感
バグ発見が遅すぎてひどい。単体テストはコードを作成、変更した時に必ずやるのが理想。
しかし、どうやって実装するかを書きながら模索しているレベルなので、単体テストをやるやらない以前の問題。言語仕様やデザインパターンなど実装の設計ができないという問題が根にあると思う。
しかしそれを解決するにも、コードを書きながら勉強していくしかない。結果、テストコードより実装が優先されてしまう。
問題だが仕方ない。学習や自動化で回避できるが、その術を確立していない現状では仕方ない。とりあえず、できることからやってみるしかない。たとえゴミコードでも何度書き直すことになろうとも効率が悪かろうとも、やってみることでしか改善しない。
問題を抱えたままで、やっていくしかない。