Download - Visual Studio 2005 を使ったテスト

Transcript
Page 1: Visual Studio 2005 を使ったテスト

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

Visual Studio 2005 を使ったテスト

Page 2: Visual Studio 2005 を使ったテスト

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

テスト機能とは?

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

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

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

Page 3: Visual Studio 2005 を使ったテスト

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

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

Team System

Team Edition forSoftware

Developers

Team Edition forSoftwareTesters

Team Edition forSoftwareArchitects

ProfessionalVSTO

Standard

ExpressC#

ExpressVB

ExpressC++

ExpressJ#

ExpressWeb

Team Edition forDatabase

Professional

Page 4: Visual Studio 2005 を使ったテスト

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

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

Page 5: Visual Studio 2005 を使ったテスト

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

開発手法として

ウォーターフォール

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

Page 6: Visual Studio 2005 を使ったテスト

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

XP とは?

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

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

ストのメインにする )

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

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

Page 7: Visual Studio 2005 を使ったテスト

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

ウォーターフォールとは

要件定義

外部設計

内部設計

コーディング

単体テスト

結合テスト

システムテスト

Page 8: Visual Studio 2005 を使ったテスト

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

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

ユーザ登録

正常に登録できること

ユーザ名がNullの場合

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

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

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

パスワードがNullの場合

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

Page 9: Visual Studio 2005 を使ったテスト

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

Demo 1

Page 10: Visual Studio 2005 を使ったテスト

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

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

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

[TestClass()]

public class 四則演算 Test

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

[TestMethod()]

public void 足し算 Test()

Page 11: Visual Studio 2005 を使ったテスト

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

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

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

Page 12: Visual Studio 2005 を使ったテスト

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

テストの実行

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

TestResults

テストプロジェクト

binDebug

user_machine_date timeInOut

binDebug

Page 13: Visual Studio 2005 を使ったテスト

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

テストの実行

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

TestResults

テストプロジェクト

binDebug

user_machine_date timeInOut

binDebug

(1)コンパイル

Page 14: Visual Studio 2005 を使ったテスト

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

テストの実行

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

TestResults

テストプロジェクト

binDebug

user_machine_date timeInOut

binDebug

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

Page 15: Visual Studio 2005 を使ったテスト

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

テストの実行

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

TestResults

テストプロジェクト

binDebug

user_machine_date timeInOut

binDebug

(3)コンパイル

Page 16: Visual Studio 2005 を使ったテスト

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

テストの実行

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

TestResults

テストプロジェクト

binDebug

user_machine_date timeInOut

binDebug

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

Page 17: Visual Studio 2005 を使ったテスト

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

テストの実行

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

TestResults

テストプロジェクト

binDebug

user_machine_date timeInOut

binDebug

(5)実行

Page 18: Visual Studio 2005 を使ったテスト

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

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

/// <summary>

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

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

///</summary>

public TestContext TestContext

この TestContext を利用します。

Page 19: Visual Studio 2005 を使ったテスト

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

TestContext ってなに?

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

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

Page 20: Visual Studio 2005 を使ったテスト

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

テストを行う順番 (Part1)

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

Page 21: Visual Studio 2005 を使ったテスト

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

テストを行う順番 (Part1)

• [ClassInitialize()]

• [TestInitialize()]

• [TestMethod()]

• [TestCleanup()]

• [TestInitialize()]

• [TestMethod()]

• [TestCleanup()]

• [ClassCleanup()]

繰り返し

Page 22: Visual Studio 2005 を使ったテスト

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

テストを行う順番 (Part1)

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

• [TestGroupInitialize()]

• [ClassInitialize()]

• [TestInitialize()]

• [TestMethod()]

• [TestCleanup()]

• [ClassCleanup()]

• [TestGroupCleanup ()]

繰り返し

Page 23: Visual Studio 2005 を使ったテスト

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

TestGroupInitialize

[ClassInitialize()]public static void

MyClassInitialize(TestContext testContext)

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

Page 24: Visual Studio 2005 を使ったテスト

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

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

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

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

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

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

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

Page 25: Visual Studio 2005 を使ったテスト

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

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

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

 やり方は 2 つあります。

Page 26: Visual Studio 2005 を使ったテスト

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

配置 (1) testrunconfig

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

Page 27: Visual Studio 2005 を使ったテスト

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

配置 (1) testrunconfig

Page 28: Visual Studio 2005 を使ったテスト

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

配置 (1) testrunconfig

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

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

Page 29: Visual Studio 2005 を使ったテスト

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

配置 (1) testrunconfig

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

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

にとどめましょう。

Page 30: Visual Studio 2005 を使ったテスト

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

毎回変更したい配置

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

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

Page 31: Visual Studio 2005 を使ったテスト

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

配置 (2) DeploymentItemAttibute

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

Page 32: Visual Studio 2005 を使ったテスト

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

配置 (2) DeploymentItemAttibute

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

Page 33: Visual Studio 2005 を使ったテスト

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

配置 (2) DeploymentItemAttibute

Page 34: Visual Studio 2005 を使ったテスト

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

配置 (2) DeploymentItemAttibute

Page 35: Visual Studio 2005 を使ったテスト

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

配置 (2) DeploymentItemAttibute

Page 36: Visual Studio 2005 を使ったテスト

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

配置 (2) DeploymentItemAttibute

Page 37: Visual Studio 2005 を使ったテスト

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

配置 (2) DeploymentItemAttibute

Page 38: Visual Studio 2005 を使ったテスト

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

配置 (2) DeploymentItemAttibute

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

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

Page 39: Visual Studio 2005 を使ったテスト

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

配置 (2) DeploymentItemAttibute

この機能の問題点

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

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

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

Page 40: Visual Studio 2005 を使ったテスト

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

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

う。

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

Page 41: Visual Studio 2005 を使ったテスト

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

データを外部から供給

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

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

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

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

Page 42: Visual Studio 2005 を使ったテスト

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

Demo 2

Page 43: Visual Studio 2005 を使ったテスト

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

DataSource 属性を使ったテスト

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

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

Page 44: Visual Studio 2005 を使ったテスト

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

DataSource 属性を使ったテスト

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

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

る )

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

ない

Page 45: Visual Studio 2005 を使ったテスト

わんくま同盟 大阪勉強会 #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

Page 46: Visual Studio 2005 を使ったテスト

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

コードカバレッジ

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

Page 47: Visual Studio 2005 を使ったテスト

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

Demo 3

Page 48: Visual Studio 2005 を使ったテスト

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

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

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

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

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

Page 49: Visual Studio 2005 を使ったテスト

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

まとめ

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

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

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

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

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

Page 50: Visual Studio 2005 を使ったテスト

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

Q & A