Weitere ähnliche Inhalte Ähnlich wie xUnitハンズオン第4回テキスト (20) xUnitハンズオン第4回テキスト5. テストするタイミング
A) コーディングのあとで
• インターフェースもクラスもその実装も、すべてコーディングしたあとで
テストする。
• はじめにコードとドキュメンテーションありき。
• ウォーターフォールモデル。
B) コーディング(実装)のまえに
• インターフェースとクラスのスタブを用意したら、実装をコーディングす
る前にテストを書く(TDD)。
• はじめにテスト(=API仕様の表明〔assertion〕)ありき。
① インターフェースとクラスのスタブを用意する
② テストを書く
③ テストを実行実行する(対象コードがスタブなので、必ず失敗する)
④ 実装を書く
⑤ テストを実行する(仕様通り実装されていれば成功する)
⑥ 仕様変更が発生したら①に戻る
• 当たり前だが工数は増える。ある研究によれば15〜25%増える。かわりに
障害(バグ)を40〜90%抑える※1。
※1 出典は@IT「いまさら聞けないTDD/BDD超入門(1):テスト駆動開発/振る舞い駆動開発を始めるため
の基礎知識」(http://www.atmarkit.co.jp/ait/articles/1403/05/news035.html)
7. テスト実行の形態
A) 手動で実行
• これまで学んできた方法。
• コンソールもしくはIDEから実行する。
B) 自動で実行
• 今回学ぶ方法。
• CIツールから実行する。
• タイミング:
a. 定期的に実行(ex. ナイトリービルドの一環として実行)
b. コミットをトリガーにして実行
c. 手動実行するビルド&デプロイのバッチ処理のなかで実行
9. ところでCIって・・・
• CI=Continuous Integration(継続的統合)
• 継続的に(できるかぎり頻繁なサイクルで)ビルド、テスト、
各種メトリクスの算出やそれに基づくレポーティングを行うこ
とで、コードの品質を一定水準に保つとともに、開発生産性を
向上させようという考え方・実践(*-ism)※1。
※1 CIの解説については右のURLなどを参照のこと:https://devops.com/continuous-integration-vs-
delivery-vs-deployment-whats-difference/
14. 作業の前説明
• 以降の説明=作業では、Jenkins v2.xのPipeline機能を使って、
NUnitで作成したテストを実行する方法を示し=実践します。
• えーと、そのまえに「Pipeline」って何ですか?
• 「Pipes and Filters Pattern」ではない。※1
• 「Continuous Delivery Pipeline」(CDP)の「Pipeline」。
• えーと(2)、そのまえに「CD」って何ですか?※2
• CIを拡張した概念。
• 製品の本番環境デプロイをも射程に入れたオートメーション化により、
品質の保証、生産性の向上、そしてスピーディなサービスインを目指
す考え方・実践(*-ism)。
※1 こちらの例としてはUNIXで導入されたパイプやASP.NETのOwin、Node.jsのStreamなどが該当。
※2 CDもしくはCDPについての解説は右のURLなどを参照のこと:https://devops.com/continuous-delivery-
pipeline/
「化石燃料や水道などと同じく、ソフトウェア(やその新機能)も淀
みない流れのように、速やかに・恒常的に顧客のもとに送り届けられ
るべきだ」ということらしい。
17. 余談
皆が不親切? or 私が遅れすぎ?
• Web上の日本語記事のほとんどが「Pipeline機能はCDを実現す
るためのものであること」や「画面でなくコードで記述するの
が重要であること」という、「そもそもの前提となる事項」に
ついてまったく言及していない。
• ことほどさように「CD/CIなんて業界的には当たり前」という
ことかもしれないが…。。
25. 4. NUnitとNuGetとGitインストール
※すでにインストールされパスが通っている場合はそれを利用するの
でもよい。
① NUnit Consoleのzipをダウンロードする。今回はv3.5。
URL:https://www.nunit.org/index.php?p=download
② zipアーカイブを任意のパスに展開する。
③ NuGet公式サイトにアクセス。
URL:https://www.nuget.org/
④ [Install NuGet]下の[All downloads]リンクをクリック。
⑤ バージョン3.4系の最新版exeをダウンロードする。
⑥ exeを任意のパスに配置する。
⑦ Gitの公式サイトにアクセス
URL:https://git-scm.com/downloads
⑧ OSおよびCPUアーキに合ったインストーラをダウンロード。
⑨ すべてデフォルト設定でダウンロードする。
macOSでは不要。
Xamarin Studioがインストー
ル済みなら不要。
35. ターミノロジー
• ステップとは?
• ある単一のタスク。例えば、shステップを使ってshell上でmakeコマ
ンドを実行するなら sh 'make'と記述する。
• Pipeline機能に対するアドインは一般にこのステップのバリエーショ
ンを増やしてくれるものが多い。
• ノードとは?
• ステージをグルーピングするもの。
• ノードが実行されると:
• Pipelineごとに固有のワークスペース(ディレクトリ)が作成される
• そのディレクトリがカレントディレクトリに設定される
• ノードに含まれる各ステップが順番にJenkinsのタスクキューに登録される
• ステージとは?
• 1〜N個のタスクをグルーピングして名前をつけるためのもの。
• 名前はPipeline実行結果の表示に反映される。
※1 あまり…というか「ぜんぜん」詳しくないが公式の解説ページは右のURL:
https://jenkins.io/doc/book/pipeline/ および https://jenkins.io/doc/book/pipeline/jenkinsfile/
36. どんどん書いていきましょう・・・
① node { ... }
② ブレース括弧の中に:
1. def msbuildExecutable = '/path/to/msbuild.exe'
2. def nugetExecutable = '/path/to/nuget.exe'
3. def nunit3ConsoleExecutable = '/path/to/nunit3-console.exe'
4. def gitRepositoryUrl = 'https://github.com/exmaple/example.git'
5. def slnName = 'Example.Solution'
6. def testProjName = 'Test.Example.Project'
38. Buildステップ
① stage('Build') {...}
② ブレース括弧の中に:
1. sh ""${nugetExecutable}" restore ${slnName}.sln"
2. sh ""${msbuildExecutable}" ${slnName}.sln
/p:Configuration=Debug /p:Platform="Any CPU""
UNIX系OSではsh、Windows
OSではbat。以下同様に適宜
読み替えてほしい。
39. Testステップ
① stage('Test') { ... }
② ブレース括弧の中に:
1. try { ... } catch(e) { } finally { ... }
2. tryのブレース括弧の中に※1:
• sh "mono "${nunit3ConsoleExecutable}" " +
"${testProjName}/bin/Debug/${testProjName}.dll " +
'"--result=TestResult.xml;format=nunit2" '
3. finallyのブレース括弧の中に:
• step([$class: 'NUnitPublisher', testResultsPattern: 'TestResult.xml', debug:
false, keepJUnitReports: true, skipJUnitArchiver:false, failIfNoResults: true])
Windows OSでは不要。
※1 NUnitプラグインは「NUnitテストを実行するためのプラグイン」ではなく「NUnitテストコンソールが出
力したレポートのXMLをJUnitの同様のXMLの形式に変換して、その結果をJenkinsに渡す(発行する)ためのプ
ラグイン」なのだそうである。違和感のある挙動だがそういうことなのだからしかたない。。