15

単体テストの使用方法を学習しています。プロジェクトを作成し、xunit 参照を追加します。そして次のコード:

namespace UnitTestProject
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        [Fact]
        private void test(int number1, string number2)
        {

            int result = number1 + Convert.ToInt32(number2);
            Assert.IsType(Type.GetType("Int32"), result);
        }
        private void Form1_Load(object sender, EventArgs e)
        {

        }
    }
}

xunit gui ツールを使用してテストを実行すると、次のように表示されました。

UnitTestProject.Form1.test : System.InvalidOperationException : ファクト メソッド UnitTestProject.Form1.test にはパラメーターを指定できません スタック トレース: ∞ Xunit.Sdk.FactCommand.Execute(Object testClass)
Xunit.Sdk.FixtureCommand.Execute(Object testClass)
Xunit.Sdk. BeforeAfterCommand.Execute(Object testClass)
Xunit.Sdk.LifetimeCommand.Execute(Object testClass)
Xunit.Sdk.ExceptionAndOutputCaptureCommand.Execute(Object testClass)

では、パラメータを使用してメソッド/関数をテストするにはどうすればよいですか?

4

3 に答える 3

24

Also you can use [Theory] instead of [Fact]. It will allow you to create test methods with different parameters. E.g.

[Theory]
[InlineData(1, "22")]
[InlineData(-1, "23")]
[InlineData(0, "-25")]
public void test(int number1, string number2)
{
    int result = number1 + Convert.ToInt32(number2);
    Assert.IsType(Type.GetType("Int32"), result);
}

p.s. With xUnit it would be better to make test methods public.

于 2011-11-17T12:57:24.567 に答える
15

テストでのランダム値とインライン メソッド/変数について。このコードは、テスト用に 100 個のランダムな int/string ペアを生成します。

    [Theory]
    [PropertyData("GetTestData")]
    public void test(int number1, string number2)
    {

        int result = number1 + Convert.ToInt32(number2);
        var expectedType = Type.GetType("System.Int32");
        Assert.IsType(expectedType, result);
    }

    public static IEnumerable<object[]> GetTestData
    {
        get { return Enumerable.Repeat(0, 100).Select(x => GenerateTestData()); }
    }

    private static object[] GenerateTestData()
    {
        var rand = new Random(0);
        return new object[] {rand.Next(0,100), rand.Next(0,100).ToString()};
    }
于 2011-11-18T08:36:20.353 に答える
2

xunit は、引数の値として何を指定するかをどのように知るのでしょうか? 単体テストは、データを使用して環境をセットアップし、必要なアクションを実行し、結果が期待どおりであることを表明する自己完結型のテストである必要があります。number1およびの外部値に依存しているため、テストは自己完結型ではありませんnumber2。次のことを試してください。

[Fact]
private void TestAdd() {
    //arrange
    int number1 = 10;
    string number2 = "10";

    //act
    object result = Add(number1,number2);

    //assert
    Assert.IsType(Type.GetType("Int32"), result);
}

private object Add(int number1, string number2)
{
    return number1 + Convert.ToInt32(number2);
}

あなたがやろうとしていること(パラメータ化された単体テスト)は、Pexツールで可能です。

于 2011-11-17T06:37:01.703 に答える