2012-12-28 11 views
7

Ilekroć chcę wykonywać pewną ścieżkę kodu, które w przeciwnym razie zostałyby osiągnięte jedynie w trudny do odtworzenia condition jak:Testowanie trudnodostępnych ścieżkę kodu

if (condition) { code to be tested } 

I or ją z wartością true:

if (true || condition) { code to be tested } 

Czy istnieje bardziej eleganckie podejście?

+0

Czy próbujesz uruchomić kod przez debugger? Radziłbym, aby to przeanalizować w "testowaniu jednostkowym". Szydercze rozwiązanie może pomóc w testowaniu kodu.Pisząc to jako test jednostkowy, możesz nie tylko przetestować swój kod teraz, ale także zachować test! –

Odpowiedz

13

myślę bardziej elegant way korzysta the logical negation operator (!) jak;

if (!condition) { code to be tested } 

Ale bardziej bezpieczny sposób do debugowania i testowania celów można użyć dyrektywę preprocesora (jak na moje komentuję). Po zakończeniu testów po prostu usunąć lub zmienić #define UnreachableTest

#define UnreachableTest //should be on the top of the class/page 

#if (UnreachableTest) 
    condition = !condition; //or 
    condition = true; 
#endif 

if (condition) { code to be tested } 
+0

Tak, to wygląda na więcej elegancki. Jedyny haczyk, że nie zadziała, gdy warunek zostanie spełniony. Ale podoba mi się to i myślę, że byłoby dobrze w większości przypadków użycia. –

+5

W takim przypadku możesz użyć "dyrektywy preprocesora", aby zmienić warunek do testowania podczas debugowania. Tak jak; '#define UnreachableTest' na górze ...' #if (UnreachableTest) condition =! condition # endif' Następnie Twój aktualny kod do naśladowania. – Kaf

+5

Przepraszam, że muszę dać -1 na tę odpowiedź. Jest to bardzo zły kod, który zmienia logiczny warunek przeprowadzania testów. Jest to niebezpieczne, ponieważ może doprowadzić do tego, że ktoś zapomni usunąć "!" i kończy się kodem produkcyjnym, w którym warunek jest odwrócony i powoduje błędy/błędy. –

13

Bardziej eleganckim rozwiązaniem jest używanie makiet. Podejmowanie decyzji na podstawie zależności lub parametrów:

var mock = new Mock<IFoo>(); 
mock.Setup(foo => foo.IsBar).Returns(true); 
var sut = new Sut(mock.Object); 
sut.DoSomething(); 

A w systemie badanego:

public void DoSomething() 
{ 
    if (_foo.IsBar) 
     // code path to test 
} 
+1

przeczytaj pytanie przed wysłaniem - "chcesz wykonać określoną ścieżkę kodu, która w przeciwnym razie byłaby osiągnięta tylko w trudnym do odtworzenia stanie" Założeniem OP jest przetestowanie kodu wewnątrz 'if', tzn. Udanie się tam ze 100% szansą – Nogard

+4

@Nogard Wspomniałem o używaniu makiet. I dodana próbka kodu. Czytaj odpowiedź do końca, zanim zaczniesz komentować. –

+1

Oczywiście, widziałem to, ale twoja wcześniej zredagowana odpowiedź (którą skomentowałem) stwierdzała tylko "trudny do odtworzenia warunek" - można by z niej również wyśmiewać się. Następnie dodano próbkę próbną i rozwiązano problem z OP. – Nogard

2

będę zakładać, nie jest to scenariusz testów jednostkowych, ponieważ nie została wymieniona w pytaniu. Zdecydowanie najprostszym sposobem wykonywania testów w locie kodu takiego jak ten jest użycie polecenia Set Next Statement debuggera.

Ustaw punkt przerwania w instrukcji if(), jeśli jest to konieczne, lub wprowadź kod, dopóki nie osiągnie tego polecenia. Następnie kliknij prawym przyciskiem myszy następną linię wewnątrz treści instrukcji if() i wybierz "Ustaw następną instrukcję". Kod wznowi wykonywanie w tej linii, całkowicie pomijając if().

+0

Dobra +1. Na pewno go użyję. Ale w tym konkretnym przypadku, w którym chcę uruchomić tę ścieżkę co najmniej kilka razy, jest to niezręczne. –

3

Twoje podejście, z "prawdziwą" i podejściem warunku if (! Warunek) są najprostsze. Oto podejście, które lubię w przypadku dużych programów.

Utwórz funkcję, nazwijmy ją testme (ciąg stały). Zamiast wstawiania prawdziwości w teście wstawiasz testme, z pewnym ciągiem, który identyfikuje ten fragment kodu.

if (testme("Location 123") || condition) { code to be tested } 

Następnie, używając jakiegoś pliku konfiguracyjnym lub argumentów do programu (wolę config), można całkowicie kontrolować, kiedy TestMe ("Location 123") zwróci true. I możesz użyć tej samej funkcji w wielu lokalizacjach. Wystarczy zmienić plik konfiguracyjny, aby przetestować każdy z nich.

+0

+1. W tym celu używam zmiennej boolean zdefiniowanej gdzie indziej. –

2

Przetestuj kod w osobnej metodzie. Następnie możesz wywołać metodę i ominąć warunek. Teraz nie musisz się martwić o dodanie "prawdziwego" lub, co ważniejsze, zapomnienie o usunięciu.

Można również dodać testy jednostkowe dla metody, aby można było modyfikować parametry przekazywane do niej i przetestować wszystkie żądane scenariusze.

Powiązane problemy