投票アプリケーションが完成したので、今度は自動テストを作ってみましょう。自動テストとは何ですか?¶テストとは、コードの動作を確認する単純なプログラムです。テストは異なるレベルで実行されます。用いてメソッドの動作を確かめたことや、実際にアプリケーションを実行して値を入力して結果がどうなるのかを確かめるといったことと、何も違いはありません。テストが他と異なる点は、テスト作業がシステムによって実行されることです。一度テストセットを作成すると、それからはアプリに変更を加えるたびに、あなたの意図した通りにコードが動作するか確認できます。手動でテストする時間がかかることはありません。知識に満足し、さらに別のことを学ぶのは大変で不必要なことだと思われるかもしれません。投票アプリケーションはきちんと動いているし、わざわざ自動テストを導入したところでアプリケーションがより良くなるわけではないのだから。プログラミングを学ぶことの全ての目的がこの投票アプリケーションを作ることであるのならば確かに自動テストの導入は必要ないと思います。ないのならば自動テストについて学ぶことは役に立つことでしょう。テストはあなたの時間を節約します¶ある一定の基準まで、’動くであろうことを確認すること’が十分なテストでしょう。高機能なアプリケーションでは、コンポーネント間で複雑な連携が数多くあるかもしれません。プログラムの変更によって予想だにしない箇所の挙動が変わってしまう可能性があります。これは効率がよくありません。自動テストを導入することによってプログラムが正しく動くことの確認を一瞬で終わらせることができ、またテストはプログラムのどこで予期せぬ動作が起きたかを見極めるのに役立つことでしょう。テストを書くという行為は、特にプログラムが適切に動くと分かっているときには、生産的でも創造的でもないつまらないことのように思われるかもしれません。テストを書くことは、何時間もかけてアプリケーションの動作を確認したり、新しく発生した問題の原因を探したりすることよりもずっとやりがいのあることなのです。テストは問題点を検出するのみならず、問題が発生するのを防ぐこともできます。¶テストを単に開発の負な面と考えることは誤りです。テストなくしては、アプリケーションの目的や意図した動作というものが曖昧になってしまうことがあります。自分自身で書いたコードであっても、時にはそのコードがすることを正確に理解するのに時間がかかってしまうことがあります。テストはこの状況を大きく変え、いわばコードを内側から照らし出してくれます。何か間違ったことをしてしまった時には、自分自身では間違っていると気づかなかった場合でさえ、間違いが起きた場所にスポットライトを当ててくれるのです。テストは、コードをより魅力的にします¶たとえあなたが輝かしいソフトウェアを作ったとしても、テストがないというそれだけの理由で、多くの開発者は見ることさえしてくれないでしょう。テストのないソフトは信用されないのです。次の言葉を残しています。「テストのないコードは、デザインとして壊れている。」あなたのソフトウェアを他の開発者が真剣に見てもらうというのも、テストを書くべきもう一つの理由です。テストを書くことはチームで共同作業を行う上で役に立ちます。¶これまでの点は、1人の開発者でアプリケーションをメンテナンスしているという観点から書きました。複雑なアプリケーションはチームでメンテナンスされるようになるものです。(そして、他の人が書いたコードをあなたが壊してしまうことからも)。プログラマとして生きてゆくつもりなら、良いテストを絶対に書かなければなりません!基本的なテスト方針¶テストを書くためのアプローチには、さまざまなものがあります。プログラマの中には、「テスト駆動開発」の原則に従っている人がいます。これは、実際にコードを書く前にテストを書く、という原則です。この原則は直感に反するように感じるかもしれませんが、実際には多くの人がどんなことでも普通にしていることに似ています。問題をきちんと言葉にしてから、その問題を解決するためのコードを書く、ということです。テストケースとして形式化しただけのことです。テストの初心者の多くは、先にコードを書いてから、その後でテストが必要だと考えるものです。早くからいくつかテストを書いておいた方が良いですが、テストを始めるのに遅すぎるということはありません。どこからテストを始めるべき場所を見つけるのが難しいこともあります。コードがあったとしたら、テストすべき場所を選ぶのは簡単ではないかもしれません。そのような場合には、次に新しい機能やバグの修正を行う時に、最初のテストを書いてみると役に立つでしょう。それでは早速始めてみましょう。アプリケーションにはすぐに修正可能な小さなバグがありました。未来の日付になっている場合にも``True``を返してしまいます(不適切な動作)。ないため、この結果は明らかに間違っています。バクをあらわにするためテストを作成します。今したことこそ、自動テストでしたいことです。そこで、それを自動テストの中に取り込みましょう。ファイル内ということになっています。始まる名前のファイルの中から、自動的にテストを見つけてくれます。ファイルに次のコードを書きます。インスタンスを作っています。出力をチェックしています。テストの実行¶ターミナルから、次のコマンドでテストが実行できます。pollsすると、次のような結果を得るでしょう。'default'...ここでは以下のようなことが起こりました。返していることを発見しますテストは私たちにテストの失敗を教えてくれるだけでなく、失敗が起こったコードの行数まで教えてくれています。私たちはすでに問題の原因を知っています。返さなければならない、ということです。返すようにしましょう。nowそして、もう一度テストを実行します。'default'...バグを発見した後、私たちはそのバグをあぶり出してくれるようなテストを書いて、コード内のバグを直したので、テストは無事にパスされました。このアプリケーションでは将来、たくさんの他のバグが生じるかもしれませんが、このバグがうっかり入ってしまうことは二度とありません。テストを実行するだけで、すぐに警告を受けられるからです。アプリケーションのこの小さな部分が、安全に、そして永遠にピン留めされたと考えて差し支えありません。メソッドをさらにピン留めしておけます。実際、一つのバグを直したことでほかのバグを作り出すなんてしたくありませんよね。このメソッドの振る舞いをより包括的にテストするために、同じクラスにさらに2つのテストを追加しましょう。過去、現在、そして未来の質問に対して意味のある値を返すことを確認する3つのテストが揃いました。簡単なアプリケーションであっても、将来このアプリケーションが他のどんなコードと関係するようになっても、複雑さは増していきます。メソッドに対してテストを書いたおかげで、今ではそのメソッドが期待したとおりに動作することを、ある程度保証でききるようになったのです。ビューをテストする¶この投票アプリケーションは、まだ質問をちゃんと見分けることができません。フィールドが未来の日付になっている質問を含め、どんな質問でも公開してしまいます。この点を改善するべきでしょう。その日付になった時に公開され、それまでは表示されないことを意味するはずです。上でバグを修正した時には、初めにテストを書いてからコードを修正しました。実は、テスト駆動開発の簡単な例だったわけです。テストとコードを書く順番はどちらでも構いません。ブラウザを通して経験する動作をチェックしましょう。初めに何かを修正する前に、使用できるツールについて見ておきましょう。