abel55の技術日記

本ブログは自分のメモ代わりでもあり、皆さまから普段頂いている技術情報 へのお返しとして、少しでも参考にしてもらえるようと始めました。

C# 開発環境/試験実行環境

C#フォームアプリケーションの開発/試験環境メモです。

PC環境

Windows 10 Home(x64)

Microsoft Visual Studio Community 2015(以降VS)

これがなくては始まりません。

インストール、使用方法などは省略します。

Nunit

単体試験テストフレームワークです。

VSのパッケージ管理(NuGet)からインストール可能ですが、NuGetを知る前に

入れてしまっていました。3.0.1がCurrentでしたが、使用例の多い2.6.4を入れました。

NUnit - Download

NUnit Test Adapter

Adapterは、Visual Studio内でNunitを実行するプラグインです。

VS - [ツール]-[拡張機能と更新プログラム]でオンライン検索/ダウンロード

f:id:abel55:20151211154826p:plain

OpenCover

カバレッジ測定ツールです。これもNuGetでインストール可能のようでしたが、GitHubのreleaseから、4.6.210msiをインストールしました。 

Releases · OpenCover/opencover · GitHub

ReportGenerator

本当はNunite Test Adapterと同様に、Microsoft Visual Studioギャラリーにある「OpenCover UI」を使用しようとしましたが、Nunitとの関連設定がわからなかった為

ツールを使用しhtml形式で見れるようにしました。

Releases · danielpalme/ReportGenerator · GitHub

 

なお導入手順および、バッチファイルの書き方まで以下を参考にさせて頂きました。

kaji-3.hatenablog.com

Codeer.Friendly

GUI操作をプログラミングできます。Nunitと併用してフォームコントロール操作をプログラムすることで、シナリオ実行をすることができます。

インストール手順、詳細情報はいかにあります(よく記載されています)

www.codeer.co.jp

 

私の場合もインストールは、NuGetで行いました。詳細情報を参考に以下(4個)を入れました。

  1. Codeer.Friendy(結局は使っていない)
  2. Codeer,Friendy.Windows
  3. Codeer,Friendy.Windows.Grasp
  4. Ong.Friendy.FormsStandardControls

上記を入れた目的は、ボタンなどのコントロールイベントハンドラの自動実行を行う

ためです。簡単なアプリケーションを作成しました。

 

WindwosFormApplication1

f:id:abel55:20151211162212p:plain

Form1.cs

using System;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
private int mNumClick;
public Form1()
{
InitializeComponent();
mNumClick = 0;
}

private void button1_Click(object sender, EventArgs e)
{
lstTest.Items.Add(new clsFunction(mNumClick.ToString()));
mNumClick++;
}

private void btn2_Click(object sender, EventArgs e)
{
if(lstTest.SelectedIndex != -1)
{
lstTest.Items.RemoveAt(lstTest.SelectedIndex);
}

}
}
}

*1

 

WindwosFormApplication1Tests

clsForm1Test.cs

 

using NUnit.Framework;
using Codeer.Friendly.Dynamic;
using Codeer.Friendly.Windows;
using System.Diagnostics;
using Codeer.Friendly.Windows.Grasp;
using System.Windows.Forms;
using Ong.Friendly.FormsStandardControls;
using WindowsFormsApplication1;

namespace WindowsFormsApplication11Tests
{
[TestFixture]
class clsForm1Test
{
WindowsAppFriend _app;

[TestFixtureSetUp]
public void TestFixtureSetUp()
{
_app = new WindowsAppFriend(Process.Start("WindowsFormsApplication1.exe"));
}
[TestFixtureTearDown]
public void TestFixtureTearDown()
{
Process.GetProcessById(_app.ProcessId).CloseMainWindow();
}

[Test]
public void Test()
{
//MainFormを取得
dynamic mainFormCore = _app.Type<Application>().OpenForms[0];
var mainForm = new WindowControl(mainFormCore);

//GUI mapping
var _button1 = new FormsButton(mainFormCore.btn1);
var _button2 = new FormsButton(mainFormCore.btn2);
var _list = new FormsListBox(mainFormCore.lstTest);

//シナリオ>>>>>>>>>>>>>>>>

//listへのアイテム追加
_button1.EmulateClick();
_button1.EmulateClick();


//listからのアイテム削除
_list.EmulateChangeSelectedIndex(0);
_button2.EmulateClick();
_list.EmulateChangeSelectedIndex(0);
_button2.EmulateClick();
_button2.EmulateClick();

//listへのアイテム追加
_button1.EmulateClick();

//シナリオ<<<<<<<<<<<<<<<<

//test結果検証
var data = (clsFunction)_list.Dynamic().Items[0]; ★

Assert.AreEqual(1, _list.ItemCount);
}
}
}

  *2 

 

詰まったところは、以下2件のみでした(いずれも詳細情報に記載あります)

  1. プロセッサーアーキテクチャー : x86->x64(試験実行時に例外)
  2. clsFunctionクラスの[Serialize]宣言★行実行時例外)

以上

 

 

 

*1:clsFunctionはコンストラクタ引数を保持するのみ

*2:Assertの前の行ですが、clsFunctionをシリアライズ転送しdataにインスタンス化したものです。(clsFunctionに[Serialize]の追加が必要)Codeerさんのサンプル通りにしましたがAssertによる検証はしていません。