【演習】実際の業務を想定して単体テストを行ってみる

それでは最後にテストについて確認していきます。システムのプロジェクトは大まかに要件定義、設計、開発、テスト、本稼働の工程に分けることができますが、テストは実際にお客さんに使ってもらう前の工程ですので開発としては最後の工程になるでしょう。

スポンサーリンク
目次

テストとは

システム開発におけるテストとは一般的なものとしては、システムが要件通りに動くかどうか確かめるものであったり、システムが想定通りに動かないバグがないかを検知するための工程の事をいいます。バグ検知の目的以外にもAIなどでは要求されたパフォーマンスが出せるかどうかの性能試験だったり、プラットフォームとかであれば稼働率が最大の時の負荷に耐えられるかどうかの耐久テストもあったり、テストの目的は様々です。

今回は単なるアプリケーションの開発ですので、性能試験や耐久テストは必要ない、というよりテストする項目がありませんので、バグ検知のみで確認しましょう。

テストの種類について

テストの目的は様々あることは上記で説明いたしましたが、テストの工程も様々あります。開発の現場ではよく飛び交う単語ですので、テストの種類を抑えておかないと話についていけないことが多いのでしっかりと把握しておきましょう。

テストの工程は主に以下の3つに分かれます。

・単体テスト

・結合テスト

・システムテスト

・受け入れテスト

それぞれ目的や、形式、やり方が異なりますので、順々に確認しましょう。

単体テスト

単体テストとは作成したプログラムの個々の機能に焦点を充ててテストを行う工程です。例えばグループウェアなどのWebアプリケーションでいえばユーザーを管理する画面、掲示板を作成する画面、チャットを行う画面など機能ごと、画面ごとに分けてテストを行うイメージです。さらにユーザー管理画面であれば、新規、更新、削除等処理が異なるプログラムが存在するはずですのでなるべくプログラムの最小単位でテストケースを洗い出します。この最小単位は現場によって様々ですので現場のやり方に合わせて適切なテストケースを作るのが望ましいです。

単体テストは英語で「Unit Test」といい、よく現場では単体テストの事を”UT”とも言ったりしますので、「ユーティー」だとか「ユーテー」といった単語が飛び交ってたら、あっ単体テストの事なんだなと思っておきましょう。

テストを行う観点としては大まかにホワイトボックステストとブラックボックステストの2種類あります。今回はそこまで踏み込んで考えませんので、そういった言葉があるということだけ認識しておいてください。Pythonには単体テストを行うためのメソッドも用意されておりますので、今後そのような記事を作る際に改めて解説しようと思います。

結合テスト

結合テストとは単体テストを行った後に実施するテスト工程になります。関連する複数の機能を合わせて動かした時に目的通りに動くかどうかをテストします。例えばユーザー管理画面で登録したユーザーでチャットが行えるか、掲示板が作成できるかといように一連の操作を行ってテストします。この一連の操作は「シナリオ」と呼ばれ、これが結合テストで確認すべき観点の一つとなります。このテストすべきシナリオを洗い出し結合テストを実施していきます。

結合テストにはさらに内部結合テスト外部結合テストに分けられます。内部結合テストは上記のようにそのシステム内で完結するシナリオでテストするものです。外部結合テストとは例えば、ユーザー管理がWindows Serverの ActiveDirectory(ユーザーを管理するサーバーのこと)で行っていた場合、Webアプリケーションから見て外部のシステムとの連携ができるかどうかをテストしなくてはいけません。このようにシステムに関連する外部のシステムとの動きをシナリオに組み込んだものが外部結合テストといいます。

システムテスト

システムテストとは総合テストとも呼ばれ、システム全体に対してテストを行うようなテストになります。結合テストと似ていますがシステムテストは実際の運用を想定して要件に沿った動作が行えるかどうかをテストします。明確な違いは後述するV字モデルを見てもらうと分りやすいと思います。

受け入れテスト

受け入れテストとはUATとも呼ばれ、テストの最後に行われるテスト工程になります。システムテストで確認したような内容をシステムを発注した側が実際に使用するような環境、本番環境などで実際に使用するユーザーを交えてテストする工程になります。ここでは要件通りに動くかどうか確認するのはもちろんですが、ユーザーが使いやすいかどうか(ユーザービリティのテスト)、同時に多人数の人が使っても問題ないか(負荷テスト)なども目的としてテストします。

テストのV字モデル

テストの目的を把握するための図として有名なものにテストのV字モデルといわれるものがあります。

V字モデルは以下のように構成されます。

上記のモデルはシステムテストまたは、受け入れテストでは要件定義で取り決めた内容の検証を、結合テストでは基本設計で設計した内容を、単体テストでは詳細設計で取り決めた内容を、実装を折り返しとしてそれぞれ検証するいわば対応表みたいなものですね。このモデルを覚えておけば各テストで何を目的としてテストケースを作成していけばいいかが想像つくかなと思います。

テストケースを作成する

それではテストケースを作成していきます。設計書は基本設計書を作りましたので、結合テストを作成する…と言いたいところですが、今回は個々の機能がちゃんと動いているかを確認したいので単体テストとして作成してみましょう。

テストケースを作成する機能を再確認する。

単体テストは機能単位で作っていくのでまずはどんな機能があったかを再確認しましょう。

機能は以下の通りでした。

  1. データの入力を受け付ける
  2. 平均を求める
  3. 標準偏差を求める
  4. 分散を求める
  5. データを出力する

これらに対してどのようにテストケースを作成するかを考えます。

テストケースを洗い出す

今回のプログラムに対してテストケースの確認観点としては以下のものが考えられます。

・有効値、無効値の確認

・境界値の確認

他にも様々な確認観点がありますが、今回は簡単に上記の内容にします。

テストケースを作成する

それでは試しに「1.データの入力を受け付ける」についてテストケースを作成します。

・有効値無効値の観点

データの種類は文字列データ、数値データの2種類です。有効値は数字データ、無効値は文字列データとなるはずですので、それらがそのままテストケースになります。

・境界値の観点

境界値テストは〇〇以上だったらこうする、○○以下だったらこうするといったテストがありますが、今回はそういった判定処理は入れておりませんので作成しません。

上記を考慮してデータの入力処理に対してテストケースを作成すると以下のようになるかと思います。

ケース名 手順 想定される結果 実際の結果
データ入力 -文字列データ 1. 「あ,い,う」などのデータを入力する データの入力が通る  
データ入力 -数値データ 1. 「1,2,3」などのデータを入力する データの入力が通る  

上記を見てもらえればわかると思いますが、文字列データの入力は計算には使えない無効な値ですのではじく必要がありますが、おそらく今のままだとデータの入力が通ってしまいます。この時点でデータの入力チェック処理が足りていないことが推察されますね。

このまま、「2.平均を求める」についてのテストケースも作成してみます。考えられる値は無効な値か有効な値かですので、上記と同じようになるかと思います。

ケース名 手順 想定される結果 実際の結果
平均算出 -文字列データ 1. 「あ,い,う」などのデータを入力する Vlue Errorとなる。  
平均算出 -数値データ 1. 「1,2,3」などのデータを入力する データの入力が通る  

上記のようになるかと思います。やる前からわかると思いますが、文字列データの計算はValueErrorになってしまいます。実際にやってみると…

errorになってしまいました。ですので、データの入力の際に文字列データが入力されたら[isdecimal]関数等でチェックし、結果が偽の場合はエラーメッセージを表示させるか、関数の処理に同じように数値チェックを施し文字列データだったらFalseを返すかして処理を終わらせる必要があります。

このようにしてバグを洗い出し、プログラムの品質を高めていきます。

今回はテストをプログラムの実装の後に作成しましたが、文字列データの入力などは事前に想定できるものですのであらかじめテストケースを作成しておき、それが問題ないように作れるようにしておくのも大事ですのである程度はプログラムの実装の前に作成するのが良いかもしれません。

以上で開発の演習についてはすべて完了です。実際の現場ではこの後に納品やら、運用、保守などを行いますがプログラミングの観点から外れるのでここまでとします。

運用についての記事を書く機会があれば改めてそちらにご案内します。

以上で演習は終了とします。

お疲れ様でした。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

本業ではPHPを使ったWEBアプリやJavaを使用した基幹アプリを作成しております。Pythonは個人的に勉強しており、E資格を取ったりしたおかげで、業務でAIの研究とかも任されるようになりました。学習のアウトプットのために本サイトを運営しておりますが、これからPythonを学ぶという人のお役に立てればいいなと思います。わからないことや調査して記事にしてほしいことがございましたらご連絡いただけると幸いです。

コメント

コメントする

目次
閉じる