Jednostka Testowanie reprezentacji szachownicy


9

To trochę dziwne pytanie.

Piszę bibliotekę szachową, zasadniczo od zera. Możesz znaleźć wiele kodu tutaj , z zamiarem użycia go do GUI i / lub silnika. (Gra jest Grand Chess, ale dla celów tego pytania nie ma to tak naprawdę znaczenia).

Obecnie piszę testy jednostkowe, aby sprawdzić, czy moje funkcje działają zgodnie z oczekiwaniami. Zastanawiałem się, czy istnieje jakaś biblioteka lub baza danych sugerowanych pozycji do przetestowania, z których mogę korzystać i z których mogę korzystać, w podziale na to, czy są to Szach, Stalemate, Czek, Legal, Nielegalne itp.

tl; dr Szukam listy pozycji, na których jednostka będzie testować mój kod.

Tutaj możesz znaleźć moje aktualne testy, które dodam do nich co kilka dni. Chcę jednak upewnić się, że testy są wyczerpujące, zanim zacznę debugować kod. (Połowa z nich zawodzi obecnie).

Edycja: w celu wyjaśnienia: Nie szukam testów silnika („najlepszego ruchu”). Szukam testów reprezentacji zarządu („jest to mat szachowy”). Mam już kilka zagadek do testów silnika.


Kodujesz wariant. Standardowy zestaw danych szachowych nie będzie dla ciebie działał. Więc obawiam się, że jesteś sam.
SmallChess

@StudentT Szukam czegoś, od czego mogę zacząć. zwykły zestaw danych byłby w porządku, skoro wiesz, mogę go edytować.
asibahi

1
Istnieje WIELE takich zestawów testowych, czy jesteś zadowolony z czegoś takiego jak perwersyjne ćwiczenia taktyczne w standardowych szachach?
SmallChess

@StudentT Nic nie znalazłem za pośrednictwem Google, dlatego pytam tutaj. Wszelkie informacje byłyby pomocne.
asibahi

To, co chcesz przetestować, ma niewiele wspólnego z reprezentacją tablicy. Będziesz chciał przetestować reprezentację planszy po wykonaniu / cofnięciu ruchów lub zaimportowaniu pozycji. Wykrywanie wiązania / impasu wymaga funkcji oceny, a testowanie legalności powinno być własną funkcją, która ma znacznie więcej do zrobienia niż sprawdzenie reprezentacji tablicy.
Queeg

Odpowiedzi:


1

Podczas czytania twojego pytania moja reakcja jelit jest taka, że ​​twój zakres jest zbyt skomplikowany do testów jednostkowych. Polecam szybkie przeczytanie bezpłatnego e-booka Testowanie zwięzłe. Jednak nie mam doświadczenia w pisaniu kodu szachowego (być może twoje paradygmaty są inne) - chociaż zarabiam na życie.

Test jednostkowy powinien być bardzo prosty i przetestować funkcję, która wykonuje 1 jedną rzecz. Następnie możesz połączyć funkcje z pewnym uzasadnieniem, że będą działać. Na przykład spodziewałbym się, że test jednostkowy każdego elementu pozwoli ustalić, czy dany ruch jest legalny. Test jednostkowy dla każdego elementu w celu ustalenia, czy wystawia króla na kontrolę. Test dla każdego elementu w celu ustalenia, gdzie atakuje itp.

Testowanie pozycji wydaje się bardzo skomplikowanym testem jednostkowym i byłoby znacznie trudniejsze do dokładnego wykonania. Zamiast tego pisz mniejsze testy dla mniejszych funkcji, a następnie wiedz, że te indywidualnie działają - ocena pozycji jest tylko kwestią iteracji prostych funkcji.

Jeśli chcesz przetestować pozycję pod kątem dobrego (niewymuszonego) ruchu, myślę, że testy jednostkowe sztucznie ograniczą długoterminowy rozwój i siłę twojego silnika szachowego ... binarny wynik testu jednostkowego zmusi twój silnik do wykonania ten sam ruch za każdym razem.

Spojrzałbym również na dodanie testów jednostkowych dla „najbardziej bezpośredniej” ścieżki do partnera ze znanymi grami końcowymi. Chciałbym również dodać testy jednostkowe dla przechodzenia przez znane otwory. Testy w środkowej fazie gry będą znacznie trudniejsze - być może podłączenie pozycji i ocena, czy silnik daje użyteczny wynik (co jest odpowiedzią binarną).

Jeśli chodzi o ocenę zestawu pozycji silnika, możesz o wiele lepiej postawić to pytanie na https://stackoverflow.com/ za pomocą znacznika „szachy”.


Dziękuję za odpowiedź. Jednak, jak zapewne można powiedzieć po rozmowie z komentarzem pod pytaniem, nie zamierzam testować algorytmów silnika. Nawet do nich nie dotarłem. Chcę sprawdzić, czy mój kod rozpoznaje, czy pozycja stojąca na planszy to mat, czy impas, czy też nie, co „tylko” liczy legalne ruchy i czy król jest w szachu. W rzeczywistości, odkąd opublikowałem to pytanie, postanowiłem skomponować niewielki zbiór pozycji do wykorzystania jako przypadki testów jednostkowych. Mogę opublikować to jako odpowiedź. (Jestem całkowicie zaskoczony, że ktoś zaoferował za to nagrodę, tbh.)
asibahi

To nie odpowiada na pytanie.
SmallChess

1
Ponadto uwagi dotyczące testowania jednostkowego są po prostu błędne.
SmallChess

@asibahi Nie miałem wystarczającej liczby przedstawicieli do opublikowania w tej sekcji komentarza, więc musiałem dodać odpowiedź. Naprawdę myślę, że z tym pytaniem będziesz lepiej obsługiwany na forum programistycznym (stackexchange). Ale w tym komentarzu ... już zidentyfikowałeś poszczególne testy jednostkowe -> Dla każdego testu jednostkowego jest legalny ruch. Jeśli iteracja po tym zwraca wartość false dla każdego elementu, masz impas lub mat, jeśli jesteś w szachu. Nie potrzebujesz do tego ogromnej kolekcji pozycji. Testując każdy element indywidualnie pod kątem jego aktualnego stanu, możesz iterować wiele elementów w celu oceny pozycji.
Paul

0

Chociaż jest to stare pytanie, pomyślałem, że koncepcja przedstawiona na tym blogu może być przydatna: http://scionsoftware.com/blog/write-tests-by-playing-chess

Chodzi o to, że grasz w szachy z graficznym interfejsem użytkownika i masz mechanizm do przechwytywania stanu szachownicy poprzez serializację do pliku.

Możesz nazwać te pliki według przypadków testowych i wprowadzić je do dowolnej zdefiniowanej metody testowej: IsCheckmate; IsLegal; IsDraw

Jednym z głównych powodów, dla których chciałbyś użyć naturalnego interfejsu użytkownika do stworzenia tych przypadków testowych, poza łatwością tworzenia, jest to, że wystarczająca liczba warunków zależy również od liczby ruchów: castling, en passant, warunki losowania.


0

Nie znam żadnej bazy danych testów jednostkowych dla silnika szachowego (ogólnie) i tak, napisanie wyczerpującego testu jednostkowego jest prawie niemożliwe.

Być może możesz odkryć alternatywne techniki testowania, takie jak testowanie właściwości (QuickCheck w Haskell, nie znam środowiska F #, ale na pewno istnieje coś takiego dla F #), które może automatycznie wygenerować dużą liczbę „pozycji” i przetestować je korzystając z właściwości określonych przez Ciebie.

Mam nadzieję, że to trochę pomoże :)!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.