Przejdź do głównej zawartości

Testy GUI


W Przetwarzaniu istnieje wsparcie dla testów automatycznych tworzonych bezpośrednio z edytora. Mechanizm znacząco ułatwia i przyśpiesza testowanie pakietów. Niezwykle przydatny będzie także w czasie rozbudowy pakietów oraz ich debugowania. Testy utworzone w edytorze bezproblemowo będzie można także uruchamiać z poziomu buildów automatycznych.

W dużym skrócie stworzenie testu składało będzie się z następujących kroków:

  1. wybór bloczka lub bloczków, które chcemy testować,
  2. wybór rekordów testowych, które zasilą testowane bloczki,
  3. ewentualne ustawienie parametrów,
  4. ewentualne napisanie asercji.

Poniżej przykładowy test, w którym testowany będzie bloczek Klasyfikacja.

Pic 233

  1. Dane wejściowe tworzone są w bloczku podglądu danych.

Pic 235

  1. Tworzenie rekordów testowych zostało tak zaprojektowane, by maksymalnie zminimalizować problemy związane z przyszłymi rozbudowami pakietów, wpływającymi na schematy rekordów.
  2. W plikach zapisywane są tylko dane wyklikane przez użytkownika, pozostałe wartości są generowane na podstawie bieżącej schemy.
  3. Wszystkie przyszłe konflikty są po cichu rozwiązywane, o ich wystąpieniu można dowiedzieć się tylko z logu.
  4. Mechanizm tworzenia rekordów testowych obsługuje mechanizm szablonów, jeden rekord może być szablonem (rekordem bazowym) dla innego rekordu.
  5. Możliwe jest zachowanie na liście rekordów testowych rekordu przechwyconego przez podglądaczkę.
  6. Wszystkie dane testowe wraz z definicjami przypadków testowych przechowywane są poza pakietem w folderze tworzonym obok testowanego pakietu.

Panel testów​

Edytor jest wyposażony w mechanizmy umożliwiające łatwe testowanie jednostkowe pakietów.

Zakładka przypadków testowych umożliwia następujące operacje:

  1. dodawanie nowego przypadku testowego lub grup przypadków testowych,
  2. uruchamianie pojedynczego przypadku testowego w trybie zintegrowanym z edytorem pakietu,
  3. uruchomienie wszystkich testów lub grup testów w sposób zoptymalizowany względem wydajności,
  4. przerwanie wykonywania testu,
  5. sklonowanie bieżącego przypadku testowego,
  6. podgląd przypadku testowego (aby podgląd był możliwy najpierw należy uruchomić test), w podglądzie widzimy pakiet jaki w rzeczywistości jest uruchamiany,
  7. w przypadku, gdy plik pakietu jest w trybie tylko do odczytu istnieje możliwość zapisu danych testowych, w tym trybie na panelu widoczny jest przycisk, który to umożliwia,
  8. zmianę kolejności testów, swobodne przenoszenie ich pomiędzy grupami poprzez drag and drop.

Możliwości, które są dostępne w trakcie tworzenia przypadku testowego:

  1. wyspecyfikowanie poszczególnych bloczków lub grup bloczków, które będą brać udział w teście (czyli będą testowane),
  2. wyspecyfikowanie, które rekordy testowe będą zasilały test (najpierw należy wybrać bloczek podglądu danych, a potem rekord danych testowych),
  3. ustawienie parametrów pakietu i poszczególnych bloczków,
  4. napisanie asercji (sprawdzenia poprawności testu) w języku wyrażeń (należy wskazać dowolny bloczek biorący udział w teście, następnie wybrać na jakim porcie testowana będzie poprawność wychodzących rekordów),
  5. przejście do grupy bloczków, stworzenie nowej grupy bloczków,
  6. przejście do rekordu testowego, utworzenie nowego rekordu testowego.

Pic 236

Tworzenie asercji​

  1. Po wyborze bloczka i portu, przez który wychodzić będą rekordy, które będą testować, należy napisać wyrażenie w języku wyrażeń, które zwróci prawdę lub fałsz (ewentualnie null w razie nieoczekiwanego błędu).
  2. Edycję wyrażenia najlepiej jest wykonywać w panelu Szczegóły.
  3. Dostępne jest jedno pole 'Count' określające ile rekordów zostało zwróconych danym portem.
  4. Dostępne są też rekordy „FirstRecord” i „Output”. „FirstRecord” umożliwia dostęp do pierwszego rekordu jaki wyszedł danym portem (zwykle mamy do czynienia z sytuacjami, w których portem wychodzić będzie zero albo tylko jeden rekord). Rekord „Output” jest rekordem wielokrotnym zawierającym wszystkie rekordy, które wyszły danym portem. W języku wyrażeń, w asercjach mamy pełen dostęp do wszystkich funkcji.

Pomocne uwagi​

  1. Testowane bloczki, bloczki dostarczające rekordy oraz bloczki, do których doczepiane są asercje, należy dodać na listę poprzez zaznaczenie ich w edytorze i wciśnięcie odpowiedniego przycisku na panelu testów. Kliknięcie na jakikolwiek bloczek na wymienionych listach powoduje skok do bloczka w edytorze.
  2. Testy często się dezaktualizują się na skutek dodawania nowych bloczków, które nie będą uwzględniane w liście bloczków przypadku testowego bądź grupy bloczków.
  3. Polecane jest częste korzystanie z grup bloczków.
  4. Jeśli port błędów nie jest testowany przez asercję, wyjście tym portem jakiegokolwiek rekordu traktowane będzie jako błąd.
  5. Bloczki usuwane z pakietu, automatycznie są usuwane z testów i grup bloczków. Podczas usuwania bloczka z pakietu zostanie wyświetlona informacja w jakich testach dany bloczek jest używany.
  6. Dane testowe są przechowywane w oddzielnych plikach w folderze tworzonym obok pakietu. Mechanizmy zapisu pakietu i zapisu danych testowych są rozdzielne. Zapis pakietu zawsze powoduje zapis danych testowych. W przypadku, gdy pakiet nie może zostać zapisany nadal istnieje możliwość zapisania danych testowych.
  7. Mechanizm zapisu danych testowych, w przeciwieństwie do mechanizmu zapisu pakietu, nie polega na fladze „dirty”. Sprawdza tylko i wyłącznie czy w pliku danych zajdą jakiekolwiek zmiany.
  8. Ikonka statusu testu, który nie był ostatnio uruchamiany jest wyszarzana. Z logicznego punktu widzenia uruchamianie jakiegoś testu oznacza, że prawdopodobnie w pakiecie wprowadzono zmiany. Po zmianach w pakiecie nie ma pewności czy test, który ostatnio przechodził lub nie przechodził, nadal tak by się zachowywał.
  9. Gdy w panelu testów zaznaczony jest pojedynczy test, bloczki, które są przez niego testowane, są podświetlane. Bloczek z pomarańczową otoczką oznacza bloczek dostarczający dane, bloczek z zieloną otoczką jest bloczkiem, na którym jest przyczepiona asercja.

Pic 237

  1. Testy działają na zasadzie tworzenia pakietu tymczasowego składającego się z bloczków, które mają być testowane.
  2. Dodatkowo w pakiecie tymczasowym znajdować będą się bloczki dostarczające dane oraz je gromadzące na potrzeby asercji.

Tworzenie rekordów testowych​

Bloczek podglądu danych, oprócz możliwości podglądania rekordów, które przez niego przepłynęły w czasie uruchamiania pakietu w edytorze, ma także możliwość tworzenia rekordów przez użytkownika. Stworzone rekordy mogą posłużyć do tworzenia przypadków testowych.

Możliwości jakie daje podglądaczka rekordów w zakresie tworzenia rekordów z danymi testowymi są wymienione poniżej.

  1. Zapisanie bieżącego przechwyconego rekordu na liście rekordów testowych. Przydatne, gdy można uruchomić pakiet z jakimiś danymi, ale gdy użytkownik chce poeksperymentować z przypadkami szczególnymi, które trudno było by uzyskać manipulując danymi wejściowymi.
  2. Utworzenie nowego rekordu. Nowy rekord jest wypełniany danymi domyślnymi dla danego typu (pola i rekordy niewymagalne: NULL; liczba: 0; tekst: „”; data\czas: 01-01-1900; itp).
  3. Każdy rekord może bazować na wartościach z innego rekordu. Dodanie do definicji rekordu wzorca rekordu powoduje, że na wartości domyślne rekordu zostaną nałożone zmiany, które wprowadza wzorzec rekordu, a następnie zmiany, które wprowadzane są do bieżącego rekordu.
  4. Rekord, który jest wykorzystywany w teście czy też jako wzorzec innego rekordu testowego, nie może być usunięty. Zależności rekordu są wypisane w tooltipie rekordu.
  5. Wartość wprowadzona przez użytkownika w bieżącym teście jest wyświetlana pogrubioną czcionką.
  6. Pole, które ma lub miało wartość wziętą z rekordów wzorcowych będzie miało różowe tło.

Każdy bloczek podglądu rekordów trzyma dane rekordów testowych w oddzielnym pliku. Zapisywane są tylko informacje, które użytkownik samodzielnie wprowadził (zmiana wartości pola, dodanie rekordu, usunięcie lub przesunięcie rekordu).

Algorytm tworzenia rekordów testowych został zaprojektowany ze szczególnym naciskiem na łatwość utrzymania testów, nawet w przypadku częstych zmian schemy rekordów na skutek modyfikacji pakietów. Każdy konflikt typów wartości (w bieżącej schemie i w danych testowych), każda wartość, która już nie ma swojego miejsca w bieżącej schemie (np. na skutek usunięcia pola ze schemy), a także pola świeżo dodane są obsługiwane w sposób cichy. Jeśli coś nie będzie nieprawidłowe to testy mają się upomnieć o aktualizację rekordów testowych.

Pic 238

  1. Istnieje możliwość dodawania nowych rekordów z poziomu panelu testów. W tym celu należy wybrać prawy przycisk myszy na reprezentacji bloczku dostarczającego dane, a następnie kliknąć Nowy rekord.

Pic 239

Uruchamianie testów z poziomu NUnit-a​

Testy stworzone z poziomu edytora mogą być uruchomione z poziomu buildów automatycznych. Wykorzystuje się do tego celu klasę 'VtsGuiTestRunner'. Poniżej propozycja jak można wykorzystać klasę 'VtsGuiTestRunner' do stworzenia czytelnych testów w NUnit.

public static class NUnitVtsGuiTestRunner
{
public static IEnumerable GetRunneres(string a_packageFile, string a_logDir)
{
var testCases = new List<TestCaseData>();
VtsGuiTestRunner.GetRunneres(
a_packageFile, a_logDir,
Console.WriteLine,
Assert.Fail,
_ => testCases.Add(
new TestCaseData(_.TestRunner)
.SetCategory(_.TestCaseGroupName)
.SetName(_.TestCaseGroupName + "." + _.TestCaseName)
.SetDescription(_.TestCaseDescription)
)
);
return testCases;
}
}

[TestFixture]
public sealed class VTS_GUI_Tests
{
[Test, TestCaseSource(typeof(VTS_GUI_Tests), "TestCasesAllPass")]
public void AllPass(Action a_test)
{
PerformanceConfig.State currentPerfState = null;
try
{
currentPerfState = PerformanceConfig.GetCurrentState();
PerformanceConfig.OptimizeForTest();
a_test();
}
finally
{
PerformanceConfig.SetState(currentPerfState);
}
}
public static IEnumerable TestCasesAllPass
{
get
{
var settings = new TestSettingsVTS2();
String pathToTestFile = Path.Combine(settings.InputDataPath, "TestCreatedInGui");
return NUnitVtsGuiTestRunner.GetRunneres(pathToTestFile + @"\" + @"all_pass.vts2p", pathToTestFile + @"\Logs");
}
}
}

Zobacz również​

Bloczki wejściowe

Bloczki transformacji

Bloczki wyjściowe

Zadania