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 開発手法として ウォーター フォール プロトタイピング モデルや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 コードカバレッジ 実際にテストがその行を通っているかをチェッ クし、漏れがないことを確認します。 わんくま同盟 大阪勉強会 #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 わんくま同盟 大阪勉強会 #1
© Copyright 2024 ExpyDoc