Jest Potwierdzona.Fail ()

Używam Assert.Fail dużo podczas robienia TDD. Zazwyczaj pracuję nad jednym testem na raz, ale kiedy mam pomysły na rzeczy, które chcę później zaimplementować, szybko piszę pusty test, w którym nazwa metody testowej wskazuje, co chcę zaimplementować jako rodzaj listy zadań. Żeby się upewnić, że nie zapomnę, że złożyłem oświadczenie.Fail() w ciele.

Podczas próby xUnit.Net okazało się, że nie wdrożyliPorażka. Oczywiście zawsze możesz to potwierdzić.IsTrue (false) ale to nie komunikuje mojego również intencje. Odnoszę wrażenie.Fail nie został zaimplementowany celowo. Czy jest to uważane za złą praktykę? Jeśli tak, to dlaczego?


@Martin Meredith Nie do końca to robię. Najpierw piszę test, a potem implementuję kod, aby działał. Zazwyczaj myślę o kilku testach na raz. Albo myślę o teście do napisania, gdy pracuję nad czymś innym. Wtedy piszę pusty test do zapamiętania. Zanim dojdę do napisania testu, zgrabnie pracuję test-pierwszy.

@ Jimmeh To chyba dobry pomysł. Ignorowane testy nie zawodzą, ale nadal pojawiają się na osobnej liście. Muszę to wypróbować.

@Matt Howells Świetny Pomysł. NotImplementedException komunikuje intencję lepiej niż assert.Fail() w tym przypadku

@Mitch Wheat Tego właśnie szukałem. Wygląda na to, że został pominięty, aby zapobiec nadużyciom w inny sposób, który nadużywam.

Author: Mendelt, 2008-09-23

13 answers

Dla tego scenariusza, zamiast wywoływania Assert.Fail, i do the following (in C# / NUnit)

[Test]
public void MyClassDoesSomething()
{
    throw new NotImplementedException();
}

Jest bardziej jednoznaczne niż twierdzenie.Porażka.

Wydaje się, że panuje ogólna zgoda, że lepiej jest używać bardziej wyraźnych twierdzeń niż twierdzeń.Fail (). Większość frameworków musi to jednak uwzględnić, ponieważ nie oferują lepszej alternatywy. Na przykład NUnit (i inne) dostarcza ExpectedExceptionAttribute, aby sprawdzić, czy jakiś kod rzuca konkretną klasę wyjątku. Jednak aby sprawdzić, czy właściwość na wyjątku jest ustawiona na określoną wartość, nie można jej użyć. Zamiast tego musisz uciekać się do twierdzenia.Fail:

[Test]
public void ThrowsExceptionCorrectly()
{
    const string BAD_INPUT = "bad input";
    try
    {
        new MyClass().DoSomething(BAD_INPUT);
        Assert.Fail("No exception was thrown");
    }
    catch (MyCustomException ex)
    {
         Assert.AreEqual(BAD_INPUT, ex.InputString); 
    }
}

The xUnit.Net method Assert.Rzuty sprawiają, że jest to dużo bardziej schludne, nie wymagając Asertu.Metoda Fail. Przez nieuwzględnienie twierdzenia.Metoda Fail () xUnit.Net zachęca programistów do znajdowania i korzystania z bardziej wyraźnych alternatyw oraz do wspierania tworzenia nowych twierdzeń w razie potrzeby.

 52
Author: Matt Howells,
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
2008-09-23 13:40:16

Został celowo pominięty. To jest odpowiedź Brada Wilsona, dlaczego nie ma żadnych dowodów.Fail ():

Nie przeoczyliśmy tego. I / align = "left" / Fail to kula, która oznacza, że prawdopodobnie istnieje brak twierdzenia. Czasami po prostu sposób ustrukturyzowania testu oraz czasem dlatego, że może użyj innego twierdzenia.
 16
Author: Mitch Wheat,
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
2013-05-26 04:24:55

Zawsze używałem Assert.Fail() do obsługi przypadków, w których wykryto, że test powinien zawieść poprzez logikę wykraczającą poza proste porównywanie wartości. Jako przykład:

try 
{
  // Some code that should throw ExceptionX
  Assert.Fail("ExceptionX should be thrown")
} 
catch ( ExceptionX ex ) 
{
  // test passed
}

Stąd brak twierdzenia.Fail () w frameworku wygląda mi na błąd. Sugerowałbym poprawienie klasy Assert tak, aby zawierała metodę Fail (), a następnie przesłanie poprawki do programistów frameworka, wraz z Twoim uzasadnieniem dodania jej.

Jeśli chodzi o twoją praktykę tworzenia testów, które celowo fail w swoim miejscu pracy, aby przypomnieć sobie, aby wdrożyć je przed popełnieniem, to wydaje mi się dobrą praktyką.

 9
Author: Craig Trader,
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
2008-09-23 12:41:53

Używam MbUnit do testów jednostkowych. Mają możliwość ignorowania testów, które w zestawie testowym pojawiają się jako pomarańczowe (a nie zielone lub czerwone). Być może xUnit ma coś podobnego i oznaczałoby to, że nie musisz nawet wkładać żadnego twierdzenia do metody, bo pojawiłoby się w nieznośnie innym kolorze, co utrudniłoby przeoczenie?

Edit:

W MbUnit jest to w następujący sposób:

[Test]
[Ignore]
public void YourTest()
{ } 
 5
Author: Jimmeh,
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
2008-09-23 12:30:57

Jest to wzorzec, którego używam podczas pisania testu dla kodu, który chcę wyrzucić wyjątek według projektu:

[TestMethod]
public void TestForException()
{
    Exception _Exception = null;

    try
    {
        //Code that I expect to throw the exception.
        MyClass _MyClass = null;
        _MyClass.SomeMethod();
        //Code that I expect to throw the exception.
    }
    catch(Exception _ThrownException)
    {   
        _Exception = _ThrownException
    }
    finally
    {
        Assert.IsNotNull(_Exception);
        //Replace NullReferenceException with expected exception.
        Assert.IsInstanceOfType(_Exception, typeof(NullReferenceException));
    }
}

IMHO jest to lepszy sposób testowania WYJĄTKÓW nad używaniem Assert.Fail (). Powodem tego jest to, że nie tylko testuję, czy w ogóle wyrzucany jest wyjątek, ale także testuję typ wyjątku. Zdaję sobie sprawę, że jest to podobne do odpowiedzi Matta Howellsa, ale IMHO korzystanie z bloku jest bardziej wytrzymałe.

Oczywiście nadal byłoby możliwe include other assert methods to test the exceptions input string etc. Byłbym wdzięczny za Wasze komentarze i opinie na temat mojego wzorca.

 4
Author: lexx,
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
2009-06-26 11:28:12

Osobiście nie mam problemu z używaniem zestawu testów jako listy zadań, o ile w końcu zaczniesz pisać test , zanim zaimplementujesz kod, aby przejść.

Powiedziawszy to, sam kiedyś korzystałem z tego podejścia, chociaż teraz odkrywam, że to prowadzi mnie do pisania zbyt wielu testów z góry, co w dziwny sposób jest jak odwrotny problem nie pisania testów w ogóle: kończy się na podejmowaniu decyzji o projektowaniu trochę za wcześnie IMHO.

Nawiasem mówiąc w MSTest, standardowy szablon testu wykorzystuje Assert.Niejednoznaczne na końcu jego próbek.

AFAIK the xUnit.NET framework ma być niezwykle lekki i tak, że celowo wycięto Fail, aby zachęcić dewelopera do korzystania z wyraźnego warunku awarii.

 3
Author: Jim Burger,
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
2008-09-23 12:38:31

Wild guess: wstrzymanie twierdzenia.Fail ma na celu powstrzymanie Cię od myślenia, że dobrym sposobem na napisanie kodu testowego jest ogromna sterta spaghetti prowadząca do twierdzenia.Porażka w złych przypadkach. [Edytuj aby dodać: odpowiedzi innych osób zasadniczo to potwierdzają, ale cytatami]

Ponieważ nie to robisz, możliwe, że xUnit.Net jest nadopiekuńcza.

A może po prostu myślą, że jest tak rzadki i tak niekonwencjonalny, że jest niepotrzebny.

Wolę zaimplementować funkcja o nazwie ThisCodeHasNotBeenWrittenYet(właściwie coś krótszego, dla ułatwienia pisania). Nie możesz przekazać intencji jaśniej niż to, a masz dokładny termin wyszukiwania.

Czy to nie powiedzie się, czy nie jest zaimplementowane (aby wywołać błąd linkera), czy jest makrem, które się nie kompiluje, można zmienić tak, aby odpowiadało bieżącym preferencjom. Na przykład, jeśli chcesz uruchomić coś, co jest zakończone, chcesz fail. Kiedy siedzisz, aby pozbyć się ich wszystkich, możesz chcesz błąd kompilacji.

 2
Author: Steve Jessop,
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
2008-09-23 12:58:08

Z dobrym kodem zwykle robię:

void goodCode() {
     // TODO void goodCode()
     throw new NotSupportedOperationException("void goodCode()");
}

Z kodem testowym zwykle robię:

@Test
void testSomething() {
     // TODO void test Something
     Assert.assert("Some descriptive text about what to test")
}

Jeśli używam JUnit, i nie chcę dostać awarii, ale błędu, to zwykle robię:

@Test
void testSomething() {
     // TODO void test Something
     throw new NotSupportedOperationException("Some descriptive text about what to test")
}
 2
Author: Daniel Fanjul,
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
2008-09-23 14:01:00

Dlaczego używasz Assert.Fail za stwierdzenie, że należy wyrzucić wyjątek? To niepotrzebne. Dlaczego po prostu nie użyć atrybutu ExpectedException?

 1
Author: ,
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
2008-10-25 02:53:56

Strzeż się {[2] } i jego szkodliwego wpływu, aby deweloperzy pisali głupie lub zepsute testy. Na przykład:

[TestMethod]
public void TestWork()
{
    try {
        Work();
    }
    catch {
        Assert.Fail();
    }
}

To jest głupie, ponieważ try-catch jest zbędny. Test nie powiedzie się, jeśli wyrzuci wyjątek.

Również

[TestMethod]
public void TestDivide()
{
    try {
        Divide(5,0);
        Assert.Fail();
    } catch { }
}

To jest złamane, test zawsze przejdzie niezależnie od wyniku funkcji dzielenia. Ponownie, test nie powiedzie się wtedy i tylko wtedy, gdy wyrzuci wyjątek.

 1
Author: Colonel Panic,
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-08-28 10:49:54

Jeśli piszesz test, który się po prostu nie powiedzie, a następnie piszesz kod do niego, to piszesz test. To nie jest Test Driven Development.

Technicznie Rzecz Biorąc,funkcja fail() nie powinna być potrzebna, jeśli poprawnie używasz Test driven development.

Czy myślałeś o użyciu listy Todo lub zastosowaniu metodologii GTD do swojej pracy?

 0
Author: Mez,
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
2008-09-23 12:31:09

MS Test ma Fail () ale ma również Assert.Inconclusive () . Myślę, że Najbardziej odpowiednie zastosowanie dla Assert.Fail() jest, jeśli masz jakąś logikę in-line, która byłaby niezręczna, aby umieścić twierdzenie, chociaż nie mogę nawet wymyślić żadnych dobrych przykładów. W większości przypadków, jeśli Framework testowy obsługuje coś innego niż Assert.Fail () następnie użyj tego.

 0
Author: Mark Cidade,
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
2008-09-23 12:36:58

Myślę, że powinniście zadać sobie pytanie, co powinno zrobić (z góry) testowanie.

Najpierw piszesz (zestaw) test bez implementacji. Może też scenariusze na deszczowy dzień.

Wszystkie te testy muszą się nie udać, aby były poprawne: Więc chcesz osiągnąć dwie rzeczy: 1) Sprawdź, czy Twoje wdrożenie jest poprawne; 2) Sprawdź, czy testy jednostkowe są poprawne.

Teraz, jeśli robisz z góry TDD, chcesz wykonać wszystkie testy, również części NYI. Wynik twojego całkowitego przejazdu testowego przechodzi jeśli: 1) Wszystkie zaimplementowane rzeczy udają się 2) wszystkie rzeczy NYI zawodzą

W końcu to byłby test jednostkowy ommision, gdyby testy jednostkowe się powiodły, podczas gdy nie ma implementacji, prawda?

Chcesz skończyć z czymś w rodzaju poczty twojego ciągłego testu integracji, który sprawdza cały zaimplementowany i nie zaimplementowany kod i jest wysyłany, jeśli jakikolwiek zaimplementowany kod nie powiedzie się lub żaden nie zaimplementowany kod nie powiedzie się. Oba są niepożądanymi wynikami.

Wystarczy napisać [ignoruj] testy praca. Ani, an twierdzi, że zatrzymuje pierwszą porażkę twierdzenia, nie uruchamiając innych linii testowych w teście.

Jak to wtedy osiągnąć? Myślę, że to wymaga bardziej zaawansowanej organizacji Twoich testów. I to wymaga innego mechanizmu, a następnie twierdzi, aby osiągnąć te cele.

Myślę, że trzeba podzielić swoje testy i stworzyć kilka testów, które całkowicie działają, ale muszą zawieść i vice versa.

Pomysły to podział testów na wiele zestawów, użycie grupowanie testów (zlecone testy w mstest mogą wykonać zadanie).

Mimo to CI build, który jeśli nie wszystkie testy w NYI zawodzą, nie jest łatwy i prosty.

 0
Author: Roland Roos,
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-10-07 12:06:00