Masowe unit testy

0

Załóżmy, że mam do przetestowania 40 obiektów tej samej klasy, każdy obiekt ma po 10 pól, które chce przetestować. Czyli musiałbym napisać z 400asercji + tworzenie każdego obiektu, a mi się nie chce.
Jak to się robi?

Myślałem nad 2 rozwiązaniami:

  1. Wypełnić .csv ze scenariuszami testowymi - 1 wiersz to 1 obiekt, kolumny to pola(cechy) obiektu i dorobić metodę, która będzie to sczytywać i wciskać po kolei te atrybuty do asercji i odpalać test.
  2. Wypełnić .csv ze scenariuszami testowymi jak powyżej i jakąś metodę, która będzie generować kod do unit testów na tych danych.
0

Czemu aż tyle? Ja jak mam przetestować 3 to uważam, że już dużo :) Najczęściej robię sobie pętle po liście atrybutów, i mam w jednej pętli załatwione wszystko.

0

Bo aplikacja jest do web miningu. Na ten moment pobiera i przetwarza ponad 1000 wiadomości, każda wiadomość ma po kilka zdań.
Mam tam zaszyty algorytm, którzy przetwarza ten tekst wyrzucając konkretne zmienne i chciałbym przetestować jak najwięcej tych wiadomości by odkryć jak najwięcej luk w algorytmie.

0

czyli te ostatnio głośne kopanie na cudzych kompach? Podaj strony które mam mijać z daleka ;)

0

nie, kopię tylko na forach internetowych treści postów ;)

przykładowo jak ktoś wpisał ile ma lat to chcę pobrać taką informację i zapisać do zmiennej age. Gdyby nie testy to do głowy by mi nie przyszło, że 1 na 100 pisze "mam 35**+** lat" i przez ten + nie łapał się na mój stary algorytm.

2

@Julian_: a myślałeś o jakimś generatorze testów jak np. Haskellowy QuickCheck?

0

o takie rady mi właśnie chodzi, bo nie znam narzędzi, z czym to się je?

0

Po pierwsze, to jak masz CSV, to Twoje testy już nie są jednostkowe.
Po drugie, to Ty nie chcesz testów, tylko znaleźć dane do oczyszczenia?

0

chcę znaleźć na jakich tekstach źle działają poszczególne metody algorytmu np. pobieranie wieku autora postu, jeśli się tym pochwalił.

0
Julian_ napisał(a):

chcę znaleźć na jakich tekstach źle działają poszczególne metody algorytmu np. pobieranie wieku autora postu, jeśli się tym pochwalił.

Nie znam się, ale nie można np. losować inputu, że wrzucamy stringi z różnymi znakami, cyframi, literami itd. o X długości. A następnie zostawić na chwilę niech mieli :P

0

Test musi być niezależny i na każdym środowisku się dopalić, więc warto tutaj generować te dane w kodzie, ew. użyć tego csv, ale z poziomi resource i osadzić w aplikacji. Zależność, od pliku zewnętrznego to kiepska praktyka da testów. Zresztą testy to ja bym napisał najpierw, a potem pisał implementacje, aż testy zrobią się zielone. Pisząc testy post factum, tak w zasadzie masz już umysł skazany daną implementacją i trudno będzie wszystko wymyślić. Jak dobrze zaprojektujesz testy i zrobisz implementacje na zielono, to zysk jest też taki, że pilnują Ci integralności kodu - czyli jak za rok zrobisz modyfikacje i jakiś test wyjdzie na czerwono to masz lampke alarmową - uwaga coś się dzieje - i albo faktycznie błąd algorytmu, lub zmiana założeń, dopuszcza złamanie testu - co trzeba uwzględnić, wszak testy też podlegają utrzymaniu. Testy sygnalizują, a nie diagnozują. Osobiście pisał bym nadmiarowe metody testujące, żeby ich nazwy już dokumentowały co testują. Mając jedną metodę ogólną i 150 wartości w csv czy tablicy nic ci nie mówi, jak wysypie się test ExecuteAllTests(), na przetwarzaniu lini 53 csv z testami. Co innego jak wysypie się metoda CheckNonNumericValueInAgeProperty();

4

Generalnie robisz to źle.

  1. Unit testy testują kod który napisałeś. W kodzie WIESZ jakie przypadki obsługujesz i dla nich piszesz testy. Wiesz jaki wzorzec kod powinien parsować i robisz test per wzorzec
  2. Możesz potem zrobić integration test dla jakiegoś zestawu "prawdziwych" danych o których wiesz jakie są wyniki.

I koniec. Na tym kończy się testowanie.
To o czym piszesz to jest jakiś fuzzing / uczenie maszynowe twojego algorytmu i jest o tyle słaby że potrzebujesz mieć zestaw danych testowych z oczekiwanymi wynikami.

1 użytkowników online, w tym zalogowanych: 0, gości: 1