Last active
December 16, 2015 14:39
-
-
Save ryz310/5449845 to your computer and use it in GitHub Desktop.
C#のテストで使ってるMyAssertクラスです。所々で手抜き感が否めません(^^;)
IsTrueSqlQuery()とかOracleにSQL丸投げして例外発生しないかチェックしてるだけだし。。。
あと本当はAssertクラスに対して拡張メソッドで書きたい。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Collections; | |
using System.Data; | |
using System.IO; | |
using System.Text; | |
using System.Text.RegularExpressions; | |
using CommonGscuht; | |
using Microsoft.VisualStudio.TestTools.UnitTesting; | |
using Oracle.DataAccess.Client; | |
namespace TestHelper | |
{ | |
/// <summary> | |
/// 真偽命題を使用して単体テストの条件を検証します。 | |
/// </summary> | |
public static class MyAssert | |
{ | |
/// <summary> | |
/// IEnumerableに対するAssert.AreEqual()を実行する | |
/// </summary> | |
/// <param name="expected"></param> | |
/// <param name="actual"></param> | |
public static void AreEqual(IEnumerable expected, IEnumerable actual) | |
{ | |
var e = expected.GetEnumerator(); | |
var a = actual .GetEnumerator(); | |
bool expectedHasNext = e.MoveNext(); | |
bool actualHasNext = a.MoveNext(); | |
Assert.AreEqual(expectedHasNext, actualHasNext); | |
while (expectedHasNext && actualHasNext) | |
{ | |
Assert.AreEqual(e.Current, a.Current); | |
expectedHasNext = e.MoveNext(); | |
actualHasNext = a.MoveNext(); | |
Assert.AreEqual(expectedHasNext, actualHasNext); | |
} | |
} | |
/// <summary> | |
/// 指定された String オブジェクトが null 参照 または Empty 文字列であるかどうかを検証します。 | |
/// </summary> | |
/// <param name="value">検証対象</param> | |
public static void IsNullOrEmpty(string value) | |
{ | |
Assert.IsTrue(string.IsNullOrEmpty(value)); | |
} | |
/// <summary> | |
/// 指定された String オブジェクトが null 参照 でも Empty 文字列でもないかどうかを検証します。 | |
/// </summary> | |
/// <param name="value">検証対象</param> | |
public static void IsNotNullAndEmpty(string value) | |
{ | |
Assert.IsFalse(string.IsNullOrEmpty(value)); | |
} | |
/// <summary> | |
/// 指定された 2 つのファイルが同一であることを検証します。2 つのファイル同一でない場合、アサーションは失敗します。 | |
/// </summary> | |
/// <param name="encoding">ファイルのエンコード</param> | |
/// <param name="expectedFilePath">比較対象の第 1 ファイルパス。これは、単体テストが予測するファイルのパスです。</param> | |
/// <param name="actualFilePath">2 番目に比較するファイルパス。これは、単体テストが生成したファイルのパスです。</param> | |
public static void AreEqualFiles(Encoding encoding, string expectedFilePath, string actualFilePath) | |
{ | |
MyAssert.AreEqualFiles(encoding, expectedFilePath, actualFilePath, null); | |
} | |
/// <summary> | |
/// 指定された 2 つのファイルが同一であることを検証します。2 つのファイル同一でない場合、アサーションは失敗します。 | |
/// </summary> | |
/// <param name="encoding">ファイルのエンコード</param> | |
/// <param name="expectedFilePath">比較対象の第 1 ファイルパス。これは、単体テストが予測するファイルのパスです。</param> | |
/// <param name="actualFilePath">2 番目に比較するファイルパス。これは、単体テストが生成したファイルのパスです。</param> | |
/// <param name="message">アサーション失敗時のメッセージ</param> | |
/// <param name="parameters">メッセージの引数</param> | |
public static void AreEqualFiles(Encoding encoding, string expectedFilePath, string actualFilePath, string message, params object[] parameters) | |
{ | |
using (var actual = new StreamReader(actualFilePath, encoding)) | |
using (var expected = new StreamReader(expectedFilePath, encoding)) | |
{ | |
Assert.AreEqual(expected.ReadToEnd(), actual.ReadToEnd(), message, parameters); | |
} | |
} | |
/// <summary> | |
/// 指定された 2 つのファイルが同一でないことを検証します。2 つのファイル同一である場合、アサーションは失敗します。 | |
/// </summary> | |
/// <param name="encoding">ファイルのエンコード</param> | |
/// <param name="expectedFilePath">比較対象の第 1 ファイルパス。これは、単体テストが予測するファイルのパスです。</param> | |
/// <param name="actualFilePath">2 番目に比較するファイルパス。これは、単体テストが生成したファイルのパスです。</param> | |
public static void AreNotEqualFiles(Encoding encoding, string expectedFilePath, string actualFilePath) | |
{ | |
MyAssert.AreNotEqualFiles(encoding, expectedFilePath, actualFilePath, null); | |
} | |
/// <summary> | |
/// 指定された 2 つのファイルが同一でないことを検証します。2 つのファイル同一である場合、アサーションは失敗します。 | |
/// </summary> | |
/// <param name="encoding">ファイルのエンコード</param> | |
/// <param name="expectedFilePath">比較対象の第 1 ファイルパス。これは、単体テストが予測するファイルのパスです。</param> | |
/// <param name="actualFilePath">2 番目に比較するファイルパス。これは、単体テストが生成したファイルのパスです。</param> | |
/// <param name="message">アサーション失敗時のメッセージ</param> | |
/// <param name="parameters">メッセージの引数</param> | |
public static void AreNotEqualFiles(Encoding encoding, string expectedFilePath, string actualFilePath, string message, params object[] parameters) | |
{ | |
using (var actual = new StreamReader(actualFilePath, encoding)) | |
using (var expected = new StreamReader(expectedFilePath, encoding)) | |
{ | |
Assert.AreNotEqual(expected.ReadToEnd(), actual.ReadToEnd(), message, parameters); | |
} | |
} | |
/// <summary> | |
/// 文字列が正規表現と一致するかどうかを検証します。 | |
/// </summary> | |
/// <param name="pattern">正規表現</param> | |
/// <param name="target">検証対象</param> | |
public static void IsMatch(string pattern, string target) | |
{ | |
MyAssert.IsMatch(pattern, target, "[{0}]というパターンが必要ですが、[{1}]が指定されました。", pattern, target); | |
} | |
/// <summary> | |
/// 文字列が正規表現と一致するかどうかを検証します。 | |
/// </summary> | |
/// <param name="pattern">正規表現</param> | |
/// <param name="target">検証対象</param> | |
/// <param name="message">アサーション失敗時のメッセージ</param> | |
/// <param name="parameters">メッセージの引数</param> | |
public static void IsMatch(string pattern, string target, string message, params object[] parameters) | |
{ | |
var regex = new Regex(pattern); | |
Assert.IsTrue(regex.IsMatch(target), message, parameters); | |
} | |
/// <summary> | |
/// SQL Select Qeuryとして正常かどうかを検証します。 | |
/// </summary> | |
/// <param name="selectQuery">データ取得クエリ</param> | |
/// <param name="parameters">取得条件パラメータ</param> | |
public static void IsTrueSqlQuery(string selectQuery, params Parameter[] parameters) | |
{ | |
MyAssert.IsTrueSqlQuery(selectQuery, 10, parameters); | |
} | |
/// <summary> | |
/// SQL Select Qeuryとして正常かどうかを検証します。 | |
/// </summary> | |
/// <param name="selectQuery">データ取得クエリ</param> | |
/// <param name="timeout">timeoutするまでの時間。単位:sec</param> | |
/// <param name="parameters">取得条件パラメータ</param> | |
public static void IsTrueSqlQuery(string selectQuery, int timeout, params Parameter[] parameters) | |
{ | |
var ds = new DataSet(); | |
var connstr = "(Database Connection String for Test)"; | |
using (var da = new OracleDataAdapter(selectQuery, connstr)) | |
{ | |
try | |
{ | |
da.SelectCommand.CommandTimeout = timeout; | |
da.MissingSchemaAction = MissingSchemaAction.AddWithKey; | |
da.SelectCommand.BindByName = true; | |
foreach (var p in parameters) | |
{ | |
da.SelectCommand.Parameters.Add(p.Name, p.Value); | |
} | |
da.Fill(ds); | |
Assert.IsTrue(true); | |
} | |
catch (Exception e) | |
{ | |
Assert.Fail(e.Message + e.StackTrace); | |
} | |
} | |
} | |
/// <summary> | |
/// 例外が発生するかどうかを検証します。 | |
/// </summary> | |
/// <typeparam name="Error">期待する例外の型</typeparam> | |
/// <param name="TestMethod"> | |
/// 検証対象メソッド。 | |
/// 以下のようなラムダ式で指定する。 | |
/// () => TestMethod(args...)</param> | |
public static void Throws<Error>(Action TestMethod) | |
where Error : Exception | |
{ | |
MyAssert.Throws<Error>(TestMethod, "期待された例外が発生しませんでした。"); | |
} | |
/// <summary> | |
/// 例外が発生するかどうかを検証します。 | |
/// </summary> | |
/// <typeparam name="Error">期待する例外の型</typeparam> | |
/// <param name="TestMethod"> | |
/// 検証対象メソッド。 | |
/// 以下のようなラムダ式で指定する。 | |
/// () => TestMethod(args...)</param> | |
/// <param name="message">アサーション失敗時のメッセージ</param> | |
/// <param name="parameters">メッセージの引数</param> | |
public static void Throws<Error>(Action TestMethod, string message, params object[] parameters) | |
where Error : Exception | |
{ | |
try | |
{ | |
TestMethod(); | |
Assert.Fail(message, parameters); | |
} | |
catch (Error) | |
{ | |
Assert.IsTrue(true); | |
} | |
//Debug mode で実行すると上手く動作しない | |
//catch (Exception e) | |
//{ | |
// Assert.Fail("期待された例外と異なる例外が発生。" + e.Message + e.StackTrace); | |
//} | |
} | |
/// <summary> | |
/// 例外が発生しない事を検証します。 | |
/// </summary> | |
/// <param name="TestMethod"> | |
/// 検証対象メソッド。 | |
/// 以下のようなラムダ式で指定する。 | |
/// () => TestMethod(args...)</param> | |
public static void NotThrows(Action TestMethod) | |
{ | |
MyAssert.NotThrows(TestMethod, "例外が発生しました。"); | |
} | |
/// <summary> | |
/// 例外が発生しない事を検証します。 | |
/// </summary> | |
/// <param name="TestMethod"> | |
/// 検証対象メソッド。 | |
/// 以下のようなラムダ式で指定する。 | |
/// () => TestMethod(args...)</param> | |
/// <param name="message">アサーション失敗時のメッセージ</param> | |
/// <param name="parameters">メッセージの引数</param> | |
public static void NotThrows(Action TestMethod, string message, params object[] parameters) | |
{ | |
try | |
{ | |
TestMethod(); | |
Assert.IsTrue(true); | |
} | |
catch | |
{ | |
Assert.Fail(message, parameters); | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment