Visual Studio 2005 を使ったテスト

Post on 02-Jan-2016

36 views 4 download

description

Visual Studio 2005 を使ったテスト. テスト機能とは?. 単調な単体テストを繰り返し行ってくれるものです。 XP(eXtreme Programming) の重要な要素のひとつです。 有名な xUnit シリーズなどがあります。. どのエディションで使えるのですか?. Team System. Team Edition for Database Professional. Team Edition for Software Architects. Team Edition for Software Developers. - PowerPoint PPT Presentation

Transcript of Visual Studio 2005 を使ったテスト

わんくま同盟 大阪勉強会 #1

Visual Studio 2005 を使ったテスト

わんくま同盟 大阪勉強会 #1

テスト機能とは?

• 単調な単体テストを繰り返し行ってくれるものです。

• XP(eXtreme Programming) の重要な要素のひとつです。

• 有名な xUnit シリーズなどがあります。

わんくま同盟 大阪勉強会 #1

どのエディションで使えるのですか?

Team System

Team Edition forSoftware

Developers

Team Edition forSoftwareTesters

Team Edition forSoftwareArchitects

ProfessionalVSTO

Standard

ExpressC#

ExpressVB

ExpressC++

ExpressJ#

ExpressWeb

Team Edition forDatabase

Professional

わんくま同盟 大阪勉強会 #1

全エディションにキャンペーン

わんくま同盟 大阪勉強会 #1

開発手法として

ウォーターフォール

プロトタイピングモデルや XP

わんくま同盟 大阪勉強会 #1

XP とは?

• リリースは小規模に・複数回(プロトタイピングモデルはウォークスルーの実現だけを行えば破棄してる場合が多い)

• ペアプログラミング• ユーザと物理的に近距離で行う• テストコードを書いて常に流す ( それをテ

ストのメインにする )

XPXP をいきなり全社的にをいきなり全社的に

行うのは非常にリスキー行うのは非常にリスキー

わんくま同盟 大阪勉強会 #1

ウォーターフォールとは

要件定義

外部設計

内部設計

コーディング

単体テスト

結合テスト

システムテスト

わんくま同盟 大阪勉強会 #1

テスト対象機能 条件 確認項目 確認日 確認者ユーザテーブルにレコードが登録されていることユーザIDが新規に振られていることユーザ名が指定のものであることメールアドレスが指定のものであることパスワードが指定のものであること例外が発生することユーザテーブルにレコードが登録されていないこと例外が発生することユーザテーブルにレコードが登録されていないこと例外が発生することユーザテーブルにレコードが登録されていないこと例外が発生することユーザテーブルにレコードが登録されていないこと例外が発生することユーザテーブルにレコードが登録されていないこと

ユーザ登録

正常に登録できること

ユーザ名がNullの場合

ユーザ名がすでに存在している場合

メールアドレスがすでに存在している場合

メールアドレスがNullの場合

パスワードがNullの場合

テスト項目書つくっていませんか?

わんくま同盟 大阪勉強会 #1

Demo 1

わんくま同盟 大阪勉強会 #1

どのような仕掛けで動いているの?

• TestClass 属性の付いているクラスの・・・

[TestClass()]

public class 四則演算 Test

• TestMethod 属性の付いているメソッドが対象です。

[TestMethod()]

public void 足し算 Test()

わんくま同盟 大阪勉強会 #1

どのフォルダで動いているの?

• ソリューションフォルダの TestResultsというフォルダ配下に、テストのユーザ・マシン・日時 \Out というフォルダを作成し、そこで動きます。

わんくま同盟 大阪勉強会 #1

テストの実行

ソリューションフォルダ対象プロジェクト

TestResults

テストプロジェクト

binDebug

user_machine_date timeInOut

binDebug

わんくま同盟 大阪勉強会 #1

テストの実行

ソリューションフォルダ対象プロジェクト

TestResults

テストプロジェクト

binDebug

user_machine_date timeInOut

binDebug

(1)コンパイル

わんくま同盟 大阪勉強会 #1

テストの実行

ソリューションフォルダ対象プロジェクト

TestResults

テストプロジェクト

binDebug

user_machine_date timeInOut

binDebug

(2)ローカルコピーの取得

わんくま同盟 大阪勉強会 #1

テストの実行

ソリューションフォルダ対象プロジェクト

TestResults

テストプロジェクト

binDebug

user_machine_date timeInOut

binDebug

(3)コンパイル

わんくま同盟 大阪勉強会 #1

テストの実行

ソリューションフォルダ対象プロジェクト

TestResults

テストプロジェクト

binDebug

user_machine_date timeInOut

binDebug

(4)ローカルコピーの取得

わんくま同盟 大阪勉強会 #1

テストの実行

ソリューションフォルダ対象プロジェクト

TestResults

テストプロジェクト

binDebug

user_machine_date timeInOut

binDebug

(5)実行

わんくま同盟 大阪勉強会 #1

実行フォルダの名称などをどのように知るか

/// <summary>

/// 現在のテストの実行についての情報および機能を

/// 提供するテスト コンテキストを取得または設定します。

///</summary>

public TestContext TestContext

この TestContext を利用します。

わんくま同盟 大阪勉強会 #1

TestContext ってなに?

このようにテストに関する情報等が入っています。

テストの追加情報を出力するための WriteLine などもあります。

わんくま同盟 大阪勉強会 #1

テストを行う順番 (Part1)

• 追加のテスト属性という Region で囲まれた部分に、テストの準備メソッドなどがあります。

わんくま同盟 大阪勉強会 #1

テストを行う順番 (Part1)

• [ClassInitialize()]

• [TestInitialize()]

• [TestMethod()]

• [TestCleanup()]

• [TestInitialize()]

• [TestMethod()]

• [TestCleanup()]

• [ClassCleanup()]

繰り返し

わんくま同盟 大阪勉強会 #1

テストを行う順番 (Part1)

本当はテスト全体の最初と最後もほしい !!!

• [TestGroupInitialize()]

• [ClassInitialize()]

• [TestInitialize()]

• [TestMethod()]

• [TestCleanup()]

• [ClassCleanup()]

• [TestGroupCleanup ()]

繰り返し

わんくま同盟 大阪勉強会 #1

TestGroupInitialize

[ClassInitialize()]public static void

MyClassInitialize(TestContext testContext)

ClassInitialize は static(shared) なメソッドなので、毎回同じ static(shared) な TestGroupInitialize を呼びstatic(shared) なフラグで初回しか動かないようにしておけば TestGroupInitializeは実現できます。

わんくま同盟 大阪勉強会 #1

たとえばこんな使い方はどうでしょう• [TestGroupInitialize()]

– DB 環境の構築• [ClassInitialize()]

– クラス全体のテスト環境 ( マスタ設定など )

• [TestInitialize()]– シナリオに沿った事前準備、トラン系テーブルのク

リア、コネクションの確立• [TestMethod()]• [TestCleanup()]

– コネクションの開放• [ClassCleanup()]

わんくま同盟 大阪勉強会 #1

テストに必要なものを配置する

テストの種類によっては CSV ファイルを用意したりしたい・・・ですよね ?

 やり方は 2 つあります。

わんくま同盟 大阪勉強会 #1

配置 (1) testrunconfig

• ソリューションアイテムの testrunconfigを使うことができます。

わんくま同盟 大阪勉強会 #1

配置 (1) testrunconfig

わんくま同盟 大阪勉強会 #1

配置 (1) testrunconfig

この設定で配置されるファイルはテスト開始前に 1 回だけです。

• Testrunconfig による配置• [ClassInitialize()]• [TestInitialize()]• [TestMethod()]• [TestCleanup()]• [ClassCleanup()]

わんくま同盟 大阪勉強会 #1

配置 (1) testrunconfig

配置されるタイミングなどから、これらの配置は

• 上書き変更しないもの• 環境差などを記述しないもの

にとどめましょう。

わんくま同盟 大阪勉強会 #1

毎回変更したい配置

 それでは毎回変更したい配置はどうしたらよいのでしょうか?

TestMethod のプロパティで設定します。

わんくま同盟 大阪勉強会 #1

配置 (2) DeploymentItemAttibute

• テストビューで配置設定したいテストを選択します

わんくま同盟 大阪勉強会 #1

配置 (2) DeploymentItemAttibute

• 配置アイテムという設定があります。

わんくま同盟 大阪勉強会 #1

配置 (2) DeploymentItemAttibute

わんくま同盟 大阪勉強会 #1

配置 (2) DeploymentItemAttibute

わんくま同盟 大阪勉強会 #1

配置 (2) DeploymentItemAttibute

わんくま同盟 大阪勉強会 #1

配置 (2) DeploymentItemAttibute

わんくま同盟 大阪勉強会 #1

配置 (2) DeploymentItemAttibute

わんくま同盟 大阪勉強会 #1

配置 (2) DeploymentItemAttibute

この機能の動くタイミング

• Testrunconfig による配置• [ClassInitialize()]• [TestInitialize()]• DeploymentItem による配置• [TestMethod()]• [TestCleanup()]• [ClassCleanup()]

わんくま同盟 大阪勉強会 #1

配置 (2) DeploymentItemAttibute

この機能の問題点

• ファイルをコピーしたままにする• 共通的な設定を含んだものをこの機能で

上書きすると、以後の設定が変わったままになる

• 完全にテストのためだけの資源にしましょう。

わんくま同盟 大阪勉強会 #1

配置 まとめ配置のタイミングと、特性に気をつけて後始末を必須とするものはコーディングしましょ

う。

• Testrunconfig による配置• [ClassInitialize()]• [TestInitialize()]• DeploymentItem による配置• [TestMethod()]• [TestCleanup()]• [ClassCleanup()]

わんくま同盟 大阪勉強会 #1

データを外部から供給

• データを受けて演算するテストがあります

• そのテストのバリエーションを外部から供給できます。

• SQL Server 2005 の AttachDBFileNameも利用可能です

• 先ほどの Demo1 の四則演算で試してみましょう。

わんくま同盟 大阪勉強会 #1

Demo 2

わんくま同盟 大阪勉強会 #1

DataSource 属性を使ったテスト

この機能の動くタイミング

• Testrunconfig による配置• アタッチ処理• コネクション処理• [ClassInitialize()]• [TestInitialize()]• DeploymentItem による配置• [TestMethod()] ← データ件数だけ繰り返し• [TestCleanup()]• [ClassCleanup()]

わんくま同盟 大阪勉強会 #1

DataSource 属性を使ったテスト

この機能の問題点• AttachDBFileName の機能の制限

– ファイルの場所がフルパスという問題– デタッチしない ( 再起動するとデタッチされ

る )

• TestResults フォルダに証拠が残らない• 全メンバーのディスク環境をそろえられ

ない

わんくま同盟 大阪勉強会 #1

DataSource 属性を使ったテスト

回避方法

• Testrunconfig で .mdf, .ldf を配置する• 本当の初期処理でデタッチする

– EXEC master.dbo.sp_detach_db @dbname = N' テストデータ ', @skipchecks = 'true', @keepfulltextindexfile=N'false'

• 続いてアタッチする– CREATE DATABASE [ テストデータ ] ON – ( FILENAME = N'" + testContext.TestDeploymentDir + @"\ テス

トデータ .mdf' ),– ( FILENAME = N'" + testContext.TestDeploymentDir + @"\ テス

トデータ _log.LDF' )– FOR ATTACH

わんくま同盟 大阪勉強会 #1

コードカバレッジ

 実際にテストがその行を通っているかをチェックし、漏れがないことを確認します。

わんくま同盟 大阪勉強会 #1

Demo 3

わんくま同盟 大阪勉強会 #1

コードカバレッジ• このように赤くなって

いるのがカバーされていない部分です。

• 残念ながらカバレッジでは、テストの正当性は証明されません。( あたりまえ )

• ほかにも保険の switch~ default 文などは実行させることができなかったり、 yield return のようなものでは 100% を保障できません。

わんくま同盟 大阪勉強会 #1

まとめ

• Visual Studio のテストはシンプルにまとまっている

• Team Foundation Server との連携を考えると、単体テストには取り組んでおくほうがよい

• カバレッジ 80 ~ 90% を目指しましょう。• 納品の条件にカバレッジを使えませんか?• VSTE for Database Professional という新しい製

品で SQL のテストも統合可能 ( 詳細はまだ )• テストファーストという新しい概念を採用しな

くても、回帰テストのためにどんどん利用しましょう

わんくま同盟 大阪勉強会 #1

Q & A