やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

SshConfigurator.pyの単体テストをした

今更ようやく。

成果物

GitHubGithub.Uploader.SshConfigurator.unittest.201704221606

開発環境

前回まで

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単体テスト済み。

所感

バグ発見が遅すぎてひどい。単体テストはコードを作成、変更した時に必ずやるのが理想。

しかし、どうやって実装するかを書きながら模索しているレベルなので、単体テストをやるやらない以前の問題。言語仕様やデザインパターンなど実装の設計ができないという問題が根にあると思う。

しかしそれを解決するにも、コードを書きながら勉強していくしかない。結果、テストコードより実装が優先されてしまう。

問題だが仕方ない。学習や自動化で回避できるが、その術を確立していない現状では仕方ない。とりあえず、できることからやってみるしかない。たとえゴミコードでも何度書き直すことになろうとも効率が悪かろうとも、やってみることでしか改善しない。

問題を抱えたままで、やっていくしかない。