mogmo .NET

C#/XAML/VB6たまにC++についてメモ程度に書いていく。あくまで自分用。責任は取れません。

テストケース管理の基礎知識

弊社はクラウドサービスの使用が禁止されているため,世に出ている便利ツールのほとんどが使えない。
Googleサービスはギリギリ使用OKなのでテスト項目管理ツール「Qase」を参考にスプレッドシートでどうにかテストケース管理できないか試行錯誤している。

テストスイート

グループ化されたテストケースのコレクションのこと。
とりあえずテストケースの種類ごとにテストスイートを作成すると良さそう。
テストスイート単位でテストプランを設定,実行することが多いと思うのでテストスイート設計時はテストプランも考えながらやると良い。
(例)

  • テストスイート 回帰テスト
    • テストスイート システム系
      • テストケース1
      • テストケース2
  • テストスイート 機能テスト
      • テストケース3

テストケース

種類

覚えておきたい種類は以下の通り。

  • スモークテスト
    • 本格的なテストに着手可能かどうか確認するテスト。「開発者さん,これができる状態でテスト部隊にソフトを渡してね」っていうテスト
    • テストエンジニアがいればスモークテストは必要かもしれない。
  • 機能テスト:ソフトウェアの仕様を満たしているか確認するテストのこと
  • 回帰テストリグレッションがないか確認するテスト
  • セキュリティテスト
  • ユーザビリティテスト
  • パフォーマンステスト
    • 負荷テスト
    • ストレステスト
    • キャパシティ(処理能力)テスト
  • 受け入れテスト:納入されたソフトの受け入れを判定するための公式テストのこと
  • その他:

テストについて

Googleスプレッドシートでテストケースを管理しているチームは世の中にどれくらいいるんだろう。。
うちの会社ではスプレッドシートやエクセルがゴリゴリに使われているので,無償のツールで成果を出さないと導入が厳しい。
という背景があり,テストケース管理ができるツールを調べてみた。

テストケース管理ツール

有料のものはごろごろある。
無料で使えるのは数少ないが「Qase」がよさそう。

Qase

Qase | Test case management software

  • メリット
    • 無料版でもユーザ制限やテストケース数に制限がない
    • ※ただし,500MBまでの容量制限はある
  • デメリット
    • 日本語非対応なので最初は学習コストちょい高い
    • エクスポートすると日本語が文字化けする。ShiftJisにエンコードする必要あり
    • 私のPCだと,Microsoft Edgeブラウザじゃないとテストケース作成ページのコンボボックスが表示されない

Klaros

Klaros Test Management - Professional Test Case Management Software
ドイツのテスト管理ソフトウェアみたい。

  • メリット
    • 買い切りプランがあるみたい
  • デメリット
    • 文献が少なそう
    • ちょっと使ってみたが直感的には操作できなさそう

Klaros Test Management - Professional Test Case Management Software

テストコード

テストコードが必要かどうか

必要ではあるが,どの段階からテスト設計・実装をしていくかが重要なように思える。

「テストコードを書く?書かない?」ソフトウェアテストのいろんな疑問をテストのプロに聞いてみた - エンジニアHub|若手Webエンジニアのキャリアを考える!

Windowsのショートカット

たまにボケるのでメモしておく。

ショートカットキー一覧

メイン機能

スタートメニューを表示する Windows
デスクトップを表示する Windows + D
設定画面を表示する Windows + I
エクスプローラーを起動する Windows+ E
ショートカットメニュー(右クリックメニュー)を表示する Shift+ F10
タスクバーからアプリを起動する Windows + 1 ~ 0

ファイルとフォルダ

前のフォルダーに戻る Alt+ ←
戻る前のフォルダーに進む Alt+ →
親フォルダーに移動する Alt+ ↑
ウィンドウを閉じる Alt+ F4

ウィンドウ

ウィンドウのメニューを表示する Alt+ Space
ウィンドウを最大化・最小化する Windows+ ↑↓
ウィンドウを左半分・右半分に合わせる Windows+ ←→
すべてのウィンドウを最小化する Windows+ M
ウィンドウを閉じる Ctrl+ W

システム

タスクマネージャー]を表示する Ctrl+ Shift+ Esc
ファイル名を指定して実行 Windows + R
クイックリンクメニューを表示する Windows+ X

仮想デスクトップ

デスクトップとタスクの一覧を表示する Windows+ Tab
仮想デスクトップを追加する Windows+ Ctrl+ D
仮想デスクトップを切り替える Windows+ Ctrl+ ←→
仮想デスクトップを閉じる Windows+ Ctrl+ F4

アクセス修飾子の確認

サンプル

プロジェクトを2つ用意して,アクセス権を確認した。

ClassLibrary1

namespace AccessApp
{
	public class Server
	{
		public void PublicMethod() { } // どこからでもアクセスできる
		internal void InternalMethod() { } // アセンブリ外からはアクセスできない
		private void PrivateMethod() { } // そのコンテナ内からしかアクセスできない
		protected void ProtectedMethod() { } // privateに加えて、継承したクラスからもアクセスできる
		protected internal void ProtectedInternalMethod() { } //  protectedに加えて,同じアセンブリからもアクセスできる(Protected or Internal)
		protected private void ProtectedPrivateMethod() { } // memo: C#7.2以降 // protectedと同様だが,継承したクラスであっても別のアセンブリからはアクセスできない(Protected and Internal)
	}

	public class ExServer : Server
	{
		public void TestAccess()
		{
			this.PublicMethod();
			this.InternalMethod();
			//this.PrivateMethod(); // error: 
			this.ProtectedMethod(); // memo: 継承したクラスなのでAccess可能
			this.ProtectedInternalMethod(); // memo: コンテナ内または継承したクラスなのでAccess可能
			this.ProtectedPrivateMethod(); // memo: コンテナ内かつ継承したクラスなのでAccess可能
		}
	}

	public class Cliant
	{
		public void TestAccess()
		{
			var server = new Server();
			server.PublicMethod();
			server.InternalMethod();
			//server.PrivateMethod(); // error:
			//server.ProtectedMethod(); // error:
			server.ProtectedInternalMethod(); // memo: コンテナ内または継承したクラスなのでAccess可能
			//server.ProtectedPrivateMethod(); // error:
		}
	}
}

ClassLibrary2

using AccessApp;

namespace ClassLibrary2
{
	public class AnotherServer : Server
	{
		public void TestAccess()
		{
			this.PublicMethod();
			//this.InternalMethod(); // error:
			//this.PrivateMethod(); // error:
			this.ProtectedMethod(); // memo: 継承したクラスからならAccessできる
			this.ProtectedInternalMethod(); // memo: コンテナ内または継承したクラスなのでAccess可能
			//this.ProtectedPrivateMethod(); // error:
		}
	}

	public class AnotherCliant
	{
		public void TestAccess()
		{
			var server = new Server();
			server.PublicMethod();
			//server.InternalMethod(); // error:
			//server.PrivateMethod(); // error:
			//server.ProtectedMethod(); // error: 
			//server.ProtectedInternalMethod(); // error:
			//server.ProtectedPrivateMethod(); // error:
		}
	}
}

クラスやメソッドの使用を禁止する

使用禁止にしたいクラスやメソッドの前にObsolete属性を付けるだけでOK。
使おうとすると,警告またはエラーが発生します。

第一引数:メッセージ
第二引数:trueならエラー,falseなら警告

[Obsolete("このメソッドは廃止される予定です。代わりに'NewMethod()' を使用してください。", false)]
private void OldMethod()
{
    // ...
}

DataGrid の表示内容をTextBoxの入力内容でフィルタリングする

参考

WPF/XAML : DataGrid の表示内容を TextBox への入力内容でフィルタリングする - i++
上記サイトにお世話になりました。
ポイントは以下3つとのこと。

  • DataGrid の ItemsSource に CollectionViewSource.View を使う
  • CollectionViewSource.Filter にフィルタリング用の関数を登録する
  • TextBox の入力に変更がある度に CollectionViewSource.View.Refresh() を呼ぶ

サンプル

Model

名前と年齢の情報を持つPersonクラス

internal class Person
{
	public string Name { get; set; }
	public int Age { get; set; }
	public Person(string name, int age)
	{
		Name = name;
		Age = age;
	}
}

ViewModel

コンストラクタでFilterにフィルタリング用の関数を登録しています。

internal class MainWindowViewModel : INotifyPropertyChanged
{
	private string _quickFilter = "";
	private ObservableCollection<Person> _people = new ObservableCollection<Person>();
	private CollectionViewSource _peopleSource;

	public string QuickFilter { get => _quickFilter; set => this.SetQuickFilter(value); }
	public ObservableCollection<Person> People { get => _people; set => SetProperty(ref _people, value); }
	public CollectionViewSource PeopleSource { get => _peopleSource; set => SetProperty(ref _peopleSource, value); }


	public MainWindowViewModel()
	{
		this._people.Add(new Person($"田中0", 20));
		this._people.Add(new Person($"伊藤0", 21));
		this._people.Add(new Person($"佐藤0", 22));
		this._people.Add(new Person($"鈴木0", 27));
		this._people.Add(new Person($"田中1", 30));
		this._people.Add(new Person($"鈴木1", 43));
		this._people.Add(new Person($"田中2", 32));
		this._people.Add(new Person($"田中3", 38));

		_peopleSource = new CollectionViewSource();
		_peopleSource.Filter += PeopleSource_Filter;
		_peopleSource.Source = _people;
	}

	private void PeopleSource_Filter(object sender, FilterEventArgs e)
	{
		if (e.Item != null)
		{
			// テキストが空の時はフィルタリングなし
			if (String.IsNullOrEmpty(this.QuickFilter))
			{
				e.Accepted = true;
			}
			else
			{
				// 部分一致を受け入れる
				Person p = e.Item as Person;
				e.Accepted = p.Name.Contains(this.QuickFilter);
			}
		}
	}

	private void SetQuickFilter(string value)
	{
		if (this._quickFilter == value) return;
		this._quickFilter = value;
		OnPropertyChanged(nameof(this.QuickFilter));

		// filtering
		this.PeopleSource.View.Refresh();
	}

	#region INotifyPropertyChanged Support
	public event PropertyChangedEventHandler PropertyChanged;
	protected void OnPropertyChanged(string propertyName)
	{
		PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
	}

	protected virtual bool SetProperty<T>(ref T field, T value, [CallerMemberName]string propertyName = null)
	{
		if (Equals(field, value)) { return false; }
		field = value;
		this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
		return true;
	}
	#endregion INotifyPropertyChanged Support
}

XAML

メインウィンドウの中身を以下のように実装。

<Grid>
	<Grid.RowDefinitions>
		<RowDefinition Height="auto"/>
		<RowDefinition Height="*"/>
	</Grid.RowDefinitions>

	<TextBox Text="{Binding Path=QuickFilter}"/>
	<DataGrid Grid.Row="1" ItemsSource="{Binding Path=PeopleSource.View}" />
</Grid>

TextBoxで右クリックするとWindowsがフリーズする

現象

Visual Studio 2017でWPFアプリを開発中に,
テキストボックスを右クリックするとVisual Studioがフリーズする現象が起きた。
どのアプリを作ってもフリーズする。困る。

Windowsのイベントビューアを見たらこんなエラーが出ていた。

f:id:mogmo811:20190529090012p:plain
Windows イベントビューア
結論から言うと,このエラーコードはマジでなんの役にも立たない。
しかし,こいつを深読みしようとしたがために,かなり遠回りをしてしまった。

やってみた対策

まずは以下のサイトを参考に,試してみた。
特定のソリューションをデバッグ実行すると、VS 2010 が異常終了する場合の対処方法 – Visual Studio サポート チーム blog

① .suoファイルの再構成

手順

.suoファイルを削除してからソリューションを開くと,.suoファイルが再構成される。

結果

ダメでした。

よく読むとこんな記述が。

特定のソリューションのみで問題が発生する場合は、このような .suo ファイル内の情報の不整合が原因で問題が発生している可能性があります。

今回特定のソリューションだけで発生するエラーではないし,関係なかったのかな。

Visual Studio の環境設定とカスタマイズ設定を初期化

手順

VS2017の場合,メニューの[ツール] > [設定のインポートとエクスポート] > [すべての設定をリセット]でウィザードの指示に従っていけば設定をリセットすることができる。

結果

設定はリセットされましたが、エラーが発生しました。
エラー 1: TypeScript 固有: 無効なデータ 'true' が含まれているため、プロパティ 'UseTypeScriptLanguageServiceForJavaScript' をインポートできません。
エラー 2: TypeScript 固有: 無効なデータ '{}[]().,:;+-*/%&|^!~=<>? ' が含まれているため、プロパティ 'CompletionChars' をインポートできません。
エラー 3: 'CoffeeScript' の設定のインポート中にエラーが発生しました [コード 5297]。

と表示された。
うぉおおおおおお。
直ってもなかったっす。

③ VS2017をセーフモードで起動する

手順

コマンドラインで/safemode付きで実行するとセーフモード起動する。
-SafeMode (devenv.exe) - Visual Studio | Microsoft Docs

cd "C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE"
devenv /safemode
結果

だめ。ああああもぅ!なんかVSの仕業じゃない気がしてきた。

④ 修復してみるか。

手順:Visual Studio を修復します | Microsoft Docs
結果:だめ

⑤ アンインストール...

手順:Visual Studio のアンインストール | Microsoft Docs
結果:だめだね

⑥ 常駐ソフトが悪さしてる?VSと切り離して考えてみる。

Windowsをセーフブート/クリーンブートして,常駐ソフトの問題なのかVSの問題なのか判断しようとしたが直らない。
(最初にやるべきだろ。)
これでソフトが関係ないと分かったが,なぜか以下のも試してしまった。

⑦ 関係ありそうなソフトをアンインストールしていく(泣)

以下のサイトにたどり着いた。
answers.microsoft.com

この手のトラブルはまず間違いなくコンテキスト メニューに項目を追加するシェル拡張が原因ですね。そういうソフトウェアがあれば、順にアンインストールして動作を確認していきましょう。
または ShellExViewAutorunsのようなツールでトラブルシュートしても良いでしょう (難易度はやや高くなりますが)。

右クリック拡張がされてそうなAppを片っ端から削除したのに直らない。
(でしょうね)

IMEに焦点を絞ってみる

英語版キーボードにすることでIMEを無効化して試してみたら...直った!!!!
ここから紆余曲折あり,IMEのプロパティを出荷状態に戻すことで解決した。
IMEの設定を出荷時の状態に戻す | 日経 xTECH(クロステック)

解決

IMEが問題で発生していた。
ただ不可解なのが,WPFアプリだけで発生する問題でMFCアプリでは発生しないことを確認。
また,自分がいじっている範囲での話だがVisual Studio(Ver.関係なく)のみこの現象が発生していた。

ほんとつかれた。(´;ω;`)ブワッ
お疲れ自分。