Skip to content

Instantly share code, notes, and snippets.

@ryz310
Last active December 16, 2015 14:39
Show Gist options
  • Save ryz310/5449845 to your computer and use it in GitHub Desktop.
Save ryz310/5449845 to your computer and use it in GitHub Desktop.
C#のテストで使ってるMyAssertクラスです。所々で手抜き感が否めません(^^;) IsTrueSqlQuery()とかOracleにSQL丸投げして例外発生しないかチェックしてるだけだし。。。 あと本当はAssertクラスに対して拡張メソッドで書きたい。
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