Parametryzacja testu w xUnit.net podobne do NUnit
Czy są jakieś środki w xUnit.net framework podobny do następujących cech NUnit?
[Test, TestCaseSource("CurrencySamples")]
public void Format_Currency(decimal value, string expected){}
static object[][] CurrencySamples = new object[][]
{
new object[]{ 0m, "0,00"},
new object[]{ 0.0004m, "0,00"},
new object[]{ 5m, "5,00"},
new object[]{ 5.1m, "5,10"},
new object[]{ 5.12m, "5,12"},
new object[]{ 5.1234m, "5,12"},
new object[]{ 5.1250m, "5,13"}, // round
new object[]{ 5.1299m, "5,13"}, // round
}
To wygeneruje 8 oddzielnych testów w GUI NUnit
[TestCase((string)null, Result = "1")]
[TestCase("", Result = "1")]
[TestCase(" ", Result = "1")]
[TestCase("1", Result = "2")]
[TestCase(" 1 ", Result = "2")]
public string IncrementDocNumber(string lastNum) { return "some"; }
Wygeneruje to 5 oddzielnych testów i automatycznie porównuje wyniki (Assert.Equal()
).
[Test]
public void StateTest(
[Values(1, 10)]
int input,
[Values(State.Initial, State.Rejected, State.Stopped)]
DocumentType docType
){}
To wygeneruje 6 testów kombinatorycznych. Bezcenne.
Kilka lat temu wypróbowałem xUnit i spodobał mi się, ale brakowało w nim tych funkcji. Nie mogę bez nich żyć. Czy coś się zmieniło?
6 answers
XUnit oferuje sposób na uruchamianie sparametryzowanych testów za pomocą czegoś, co nazywa się teoriami danych . Koncepcja jest równoważna tej, którą można znaleźć w NUnit, ale funkcjonalność, którą można uzyskać po wyjęciu z pudełka, nie jest tak kompletna.
Oto przykład:
[Theory]
[InlineData("Foo")]
[InlineData(9)]
[InlineData(true)]
public void Should_be_assigned_different_values(object value)
{
Assert.NotNull(value);
}
W tym przykładzie xUnit uruchomi test {[1] } raz na każde InlineDataAttribute
za każdym razem przekazując podaną wartość jako argument.
Teorie danych są punktem rozszerzalności , który można wykorzystać do stworzenia nowe sposoby przeprowadzania testów sparametryzowanych. Sposób, w jaki odbywa się to poprzez tworzenie nowych atrybutów, które sprawdzają i opcjonalnie działają na argumenty i zwracają wartość metod testowych.
Możesz znaleźć dobry praktyczny przykład, jak teorie danych xUnit mogą być rozszerzone wautofixture 'sAutoData iinlineautodata teoriach.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-07 18:40:30
Pozwól, że rzucę jeszcze jedną próbkę, na wypadek, gdyby to komuś oszczędziło trochę czasu.
[Theory]
[InlineData("goodnight moon", "moon", true)]
[InlineData("hello world", "hi", false)]
public void Contains(string input, string sub, bool expected)
{
var actual = input.Contains(sub);
Assert.Equal(expected, actual);
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-29 20:31:05
Na pierwsze życzenie możesz skorzystać z przykładów znalezionych tutaj .
Możesz skonstruować statyczną klasę zawierającą dane niezbędne do zbioru testów
using System.Collections.Generic;
namespace PropertyDataDrivenTests
{
public static class DemoPropertyDataSource
{
private static readonly List<object[]> _data = new List<object[]>
{
new object[] {1, true},
new object[] {2, false},
new object[] {-1, false},
new object[] {0, false}
};
public static IEnumerable<object[]> TestData
{
get { return _data; }
}
}
}
Następnie, używając atrybutu Memdata, zdefiniuj test jako taki
public class TestFile1
{
[Theory]
[MemberData("TestData", MemberType = typeof(DemoPropertyDataSource))]
public void SampleTest1(int number, bool expectedResult)
{
var sut = new CheckThisNumber(1);
var result = sut.CheckIfEqual(number);
Assert.Equal(result, expectedResult);
}
}
Lub jeśli używasz C # 6.0,
[Theory]
[MemberData(nameof(PropertyDataDrivenTests.TestData), MemberType = typeof(DemoPropertyDataSource))]
Pierwszy argument MemberDataAttribute pozwala ci zdefiniować członka, którego używasz jako źródła danych, więc masz dużą elastyczność w ponownym użyciu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-19 13:03:42
Zgodnie z Ten artykuł {[5] } w xUnit masz trzy opcje "parametryzacji":
- InlineData
- ClassData
- MemberData
Przykład InlineData
[Theory]
[InlineData(1, 2)]
[InlineData(-4, -6)]
[InlineData(2, 4)]
public void FooTest(int value1, int value2)
{
Assert.True(value1 + value2 < 7)
}
Przykład ClassData
public class BarTestData : IEnumerable<object[]>
{
public IEnumerator<object[]> GetEnumerator()
{
yield return new object[] { 1, 2 };
yield return new object[] { -4, -6 };
yield return new object[] { 2, 4 };
}
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}
[Theory]
[ClassData(typeof(BarTestData))]
public void BarTest(int value1, int value2)
{
Assert.True(value1 + value2 < 7)
}
Przykład MemberData
[Theory]
[MemberData(nameof(BazTestData))]
public void BazTest(int value1, int value2)
{
Assert.True(value1 + value2 < 7)
}
public static IEnumerable<object[]> BazTestData => new List<object[]>
{
new object[] { 1, 2 },
new object[] { -4, -6 },
new object[] { 2, 4 },
};
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-04 12:45:51
Znalazłem bibliotekę, która generuje podobną funkcjonalność do atrybutu [Values]
NUnit o nazwie Xunit.Kombinatoryczne :
Pozwala na określenie wartości poziomu parametrów:
[Theory, CombinatorialData]
public void CheckValidAge([CombinatorialValues(5, 18, 21, 25)] int age,
bool friendlyOfficer)
{
// This will run with all combinations:
// 5 true
// 18 true
// 21 true
// 25 true
// 5 false
// 18 false
// 21 false
// 25 false
}
Lub możesz w domyśle ustalić minimalną liczbę wywołań, aby pokryć wszystkie możliwe kombinacje:
[Theory, PairwiseData]
public void CheckValidAge(bool p1, bool p2, bool p3)
{
// Pairwise generates these 4 test cases:
// false false false
// false true true
// true false true
// true true false
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-14 21:23:42
Wzięłam na pokład wszystkie odpowiedzi tutaj i dodatkowo skorzystałam z typów generycznych XUnit TheoryData<,>
, aby dać mi proste, łatwe do odczytania i wpisz bezpieczne definicje danych dla atrybutu 'MemberData' w moim teście, jak na poniższym przykładzie:
/// must be public & static for MemberDataAttr to use
public static TheoryData<int, bool, string> DataForTest1 = new TheoryData<int, bool, string> {
{ 1, true, "First" },
{ 2, false, "Second" },
{ 3, true, "Third" }
};
[Theory(DisplayName = "My First Test"), MemberData(nameof(DataForTest1))]
public void Test1(int valA, bool valB, string valC)
{
Debug.WriteLine($"Running {nameof(Test1)} with values: {valA}, {valB} & {valC} ");
}
NB Korzystanie z VS2017( 15.3.3), C # 7, & XUnit 2.2.0 Dla. Net Core
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-05 09:23:30