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

Visual Studio 2005を使ったテスト
わんくま同盟 大阪勉強会 #1
テスト機能とは?
• 単調な単体テストを繰り返し行ってくれるもの
です。
• XP(eXtreme Programming)の重要な要素の
ひとつです。
• 有名なxUnitシリーズなどがあります。
わんくま同盟 大阪勉強会 #1
どのエディションで使えるのですか?
Team System
Team Edition for
Database
Professional
Team Edition for
Software
Architects
Team Edition for
Software
Developers
VSTO
Team Edition for
Software
Testers
Professional
Standard
Express
C#
Express
VB
Express
C++
Express
J#
Express
Web
わんくま同盟 大阪勉強会 #1
全エディションにキャンペーン
わんくま同盟 大阪勉強会 #1
全エディションにキャンペーン
わんくま同盟 大阪勉強会 #1
開発手法として
ウォーター
フォール
プロトタイピング
モデルやXP
わんくま同盟 大阪勉強会 #1
XPとは?
• リリースは小規模に・複数回(プロトタイピング
モデルはウォークスルーの実現だけを行えば
破棄してる場合が多い)
• ペアプログラミング
• ユーザと物理的に近距離で行う
• テストコードを書いて常に流す(それをテスト
のメインにする)
XPをいきなり全社的に
行うのは非常にリスキー
わんくま同盟 大阪勉強会 #1
ウォーターフォールとは
要件定義
システムテスト
外部設計
結合テスト
内部設計
単体テスト
コーディング
わんくま同盟 大阪勉強会 #1
テスト項目書つくっていませんか?
テスト対象機能 条件
ユーザ登録
確認項目
確認日 確認者
ユーザテーブルにレコードが登録されていること
ユーザIDが新規に振られていること
正常に登録できること
ユーザ名が指定のものであること
メールアドレスが指定のものであること
パスワードが指定のものであること
例外が発生すること
ユーザ名がNullの場合
ユーザテーブルにレコードが登録されていないこと
例外が発生すること
ユーザ名がすでに存在している場合
ユーザテーブルにレコードが登録されていないこと
例外が発生すること
メールアドレスがすでに存在している場合
ユーザテーブルにレコードが登録されていないこと
例外が発生すること
メールアドレスがNullの場合
ユーザテーブルにレコードが登録されていないこと
例外が発生すること
パスワードがNullの場合
ユーザテーブルにレコードが登録されていないこと
わんくま同盟 大阪勉強会 #1
Demo 1
わんくま同盟 大阪勉強会 #1
どのような仕掛けで動いているの?
• TestClass属性の付いているクラスの・・・
[TestClass()]
public class 四則演算Test
• TestMethod属性の付いているメソッドが対象
です。
[TestMethod()]
public void 足し算Test()
わんくま同盟 大阪勉強会 #1
どのフォルダで動いているの?
• ソリューションフォルダのTestResultsという
フォルダ配下に、テストのユーザ・マシン・日
時\Outというフォルダを作成し、そこで動きま
す。
わんくま同盟 大阪勉強会 #1
テストの実行
ソリューションフォルダ
対象プロジェクト
bin
Debug
TestResults
user_machine_date time
In
Out
テストプロジェクト
bin
Debug
わんくま同盟 大阪勉強会 #1
テストの実行
ソリューションフォルダ
対象プロジェクト
bin
(1)コンパイル
Debug
TestResults
user_machine_date time
In
Out
テストプロジェクト
bin
Debug
わんくま同盟 大阪勉強会 #1
テストの実行
ソリューションフォルダ
対象プロジェクト
bin
Debug
TestResults
user_machine_date time
In
Out
(2)ローカルコピーの取得
テストプロジェクト
bin
Debug
わんくま同盟 大阪勉強会 #1
テストの実行
ソリューションフォルダ
対象プロジェクト
bin
Debug
TestResults
user_machine_date time
In
Out
テストプロジェクト
bin
(3)コンパイル
Debug
わんくま同盟 大阪勉強会 #1
テストの実行
ソリューションフォルダ
対象プロジェクト
bin
Debug
TestResults
user_machine_date time
In
Out
テストプロジェクト
bin
Debug
(4)ローカルコピーの取得
わんくま同盟 大阪勉強会 #1
テストの実行
ソリューションフォルダ
対象プロジェクト
bin
Debug
TestResults
user_machine_date time
In
(5)実行
Out
テストプロジェクト
bin
Debug
わんくま同盟 大阪勉強会 #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
まとめ
• Visual Studioのテストはシンプルにまとまっ
ている
• Team Foundation Serverとの連携も可能
• VSTE for Database Professionalという新し
い製品でSQLのテストも統合可能
• テストファーストという新しい概念を採用しなく
ても、回帰テストのためにどんどん利用しま
しょう
わんくま同盟 大阪勉強会 #1
Q&A
わんくま同盟 大阪勉強会 #1