総当たり攻撃
グラフを作成します。グラフランナーを作成します。すべての実行情報をキャッシュします。ランナーにグラフを再実行させ、実行情報からすべての決定を除外します。ランナーが実行できなくなったら、キャッシュされたデータをフィルタリングして結果をカウントします。
C#での実装
nunitのようなテストフレームワークをインストールします。必要な機能のリストを作成します。
機能リストが空になるまで繰り返します。
- 最小の機能を選択します
- 失敗したテストを書く
- テストに合格するためのコードを書く
- すべてのテストに合格することを確認します
- prittyにするためのリファクタリング
- 機能リストからアイテムをクリア
終わり
コメントのいくつかの質問に答えるために編集されました
- nunitはインターネットからダウンロードできます。お好みのフォルダに解凍してください。
- 空のコンソールアプリケーションを作成します。
- NUnitディレクトリを調べてフレームワークを見つけ、そのフレームワークをプロジェクトに追加します。
- NUnitディレクトリを調べてGUIランナーを見つけ、プロジェクトに追加します。
- 実際には、コンソールでプロジェクトを実行する必要はありません。フォームを自動作成し、プロパティを開いて、プロジェクトをWindowsアプリケーションとして再宣言するだけです。
- program.csを以下のコードに置き換えます。
- コンパイルして実行します。GUIで[実行]をクリックし、例外が発生した場合はF5キーを押します
- おめでとうございます-あなたはちょうどnunitを使用しました
プログラムは次のとおりです。
using System;
using NUnit.Framework;
namespace EC_Connect_Test
{
class Program
{
[STAThread]
static void Main(string[] args)
{
string fullPath = System.Reflection.Assembly.GetAssembly(typeof(Program)).Location;
NUnit.Gui.AppEntry.Main(new string[] { fullPath });
}
}
public class MathClass
{
internal static double Divide(int A, int B)
{
if (B == 0) throw new DivideByZeroException();
return (Double)A / (Double)B;
}
}
[TestFixture]
class MyFirstTestClass
{
[Test]
public void DividingTwoIntegersResultIsDouble()
{
Double expected = 3.3;
Double actual = MathClass.Divide(33, 10);
Assert.AreEqual(expected, actual);
}
[Test]
public void DividingByZeroShouldThrow()
{
Assert.Throws<DivideByZeroException>(
() => { MathClass.Divide(33, 0); }
);
}
}
}
Nunitを外部から起動して、ディレクトリとしてdebugprojectを指定することもできます。そうすれば、例外が発生せず、テストが簡単になります。
機能リストは、単にソフトウェアに実行させたいことです。あなたの場合、あなたは何らかの形で与えられたグラフを提供されます。それはファイルまたは一枚の紙である可能性があります。したがって、1つの機能は、その情報をロードし、そこからグラフを作成することです。あなたが言及した次の機能は、プログラムがn <= 10をチェックし、そうでない場合は動作を拒否する必要があるということです。これも機能です。もう1つは、特定のインターフェイスを介して結果を返すことです。そして最後に重要なのは、実際にすべての接続を見つける機能です。それらを自分でリストする場合は、最も簡単だと思うものを選択して、その1つから始めることができます。
テストするときは、既知のケースのエンドツーエンドのテストを作成することを忘れないでください。グラフを固定し、既知の数を出力します。
ワイルドな仮定を使用すると、グラフはテキストファイルにあり、各行には他の行への接続が一覧表示され、次のようなテストを記述できます。
[TestFixture]
class graphloadingSpex
{
String[] lines = new String[] {
"2,3,4",
"1",
"1,4",
"1,3"
};
[Test]
public void ShouldShowConnectionsAfterLoading()
{
Graph tested = new Graph(lines);
Assert.AreEqual(new String[] { "2", "3", "4" }, tested["1"].GetConnextions());
Assert.AreEqual(new String[] { "1"}, tested["2"].GetConnextions());
Assert.AreEqual(new String[] { "1", "4" }, tested["3"].GetConnextions());
Assert.AreEqual(new String[] { "1", "3" }, tested["4"].GetConnextions());
}
}
グラフがまだ存在しないため、これはコンパイルされません。ただし、コンパイルしてテストに合格させると、最初の機能が満たされ、最初にテストを記述して次の機能を実装し続けることができます。