2010-05-27 9 views
7

Muszę napisać dużo kodu, który zajmuje się portami szeregowymi. Zwykle na drugim końcu drutu pojawi się urządzenie, a ja zwykle tworzę własne drwiny, aby symulować ich zachowanie.Jak utworzyć próbę SerialPort przy użyciu biblioteki Moq?

Zaczynam patrzeć na Moq, aby pomóc w testach jednostkowych. Jest bardzo prosty w użyciu, gdy potrzebujesz tylko kodu pośredniczącego, ale chcę wiedzieć, czy jest to możliwe, a jeśli tak, to jak utworzyć próbę dla urządzenia sprzętowego, które reaguje inaczej w zależności od tego, co chcę przetestować.

Prosty przykład:

Jednym z urządzeniami I-Interface z odbiera polecenia (ruch do pozycji X), oddaje się komunikat ACK i przechodzi do stanu „Moving”, aż osiągnie zamówionej pozycji.

Chcę utworzyć test, w którym wysyłam polecenie przenoszenia, a następnie sprawdzaj stan, aż osiągnie ostateczną pozycję.

Chcę utworzyć dwie wersje próbne dla dwóch różnych testów, jedną, w której oczekuję, że urządzenie osiągnie ostateczną pozycję, a drugie, gdzie zakończy się niepowodzeniem.

Za dużo, aby zapytać?

Odpowiedz

4

Jeśli posiadasz interfejs dla obiektu portu szeregowego w swoim programie, to Moq może to zrobić, tworząc fałszywy obiekt portu szeregowego (Moq jest dobry zarówno dla skrótów, jak i makiet o dowolnej złożoności).

Jeśli chcesz osią zaproszeń do BCL SerialPort klasie, zanim dotrą do sprzętu (bez konieczności tworzenia interfejs portu szeregowego i wdrażania, a także implementację testową), to trzeba coś mocniejszego. Właśnie do tego służy Moles.

Jeśli chcesz faktycznie emulować urządzenie, wykracza to poza "testowanie urządzenia". Na tym poziomie można użyć com0com, aby dodać parę wirtualnych portów szeregowych i napisać emulator do urządzenia, z którym testy mogą rozmawiać. Na tym poziomie jest o wiele bardziej skomplikowana (choć niemożliwa) automatyzacja testów.

+0

Tak, mam już ISerialDrive, SerialPortDrive i kilka klas MockSerialPortDrive. Używam SerialPortDrive dla mojego kodu produkcyjnego i używam jednego próbnego dla każdego testowanego urządzenia. Niektóre są dość proste i można je łatwo zastąpić próbkami Moq, ale inne implementują inteligentniejszą symulację sprzętu, z którym się łączą. –

0

Jeśli używasz mizingu, powinieneś pozwolić testom zdefiniować swoje obiekty. Już brzmi, jakbyś miał na myśli projekt, zanim napiszesz jakieś testy.

Twój wstępny projekt posiada:

  • nadawca komend
  • odbiornik poleceń
  • Polling (asynchroniczny/synchroniczny)
  • przez następstwo trzeba mieć Timeout funkcję

czyli już obowiązki, które musi wdrożyć Twój SerialController. Wow, które można wdrożyć bez żadnych testów.

Zacznij ładnie i łatwo.

Spróbuj i przetestuj pomysł: "Ostatnia chwila odpowiedzialności".

A co ze składnią, której będziesz używać?

Może chcesz to sprawdzić: how-to-test-reliability-of-my-own-small-embedded-operating-system

daję linki do sposobu Atomic klasy Object prowadzenia sprzętu i James Ekologiczny Blog. James ma kilka dobrych artykułów na temat TDD ze sprzętem (nie martw się o ruby, c, i C++.) Jeśli robisz sprzęt, to grałeś z c i C++ przed;)).

BTW, wygląda całkiem ekscytująco, co robisz.

+0

Dzięki za odpowiedź. Wszystkie ważne uwagi, ale uważam, że ryzykujemy popadnięciem w dyskusję, która nie leży u podstaw mojego pytania. Próbowałem obu stylów i nadal uważam, że posiadanie jakiegoś projektu przed testowaniem jest korzystne, ale widzę obie strony. Moje pytanie jest jednak bardziej ukierunkowane na to, jak używać Moq do robienia czegoś, co obecnie robię ręcznie. –

+0

@Padu - Myślę, że twój komentarz do @Stephen wzmacnia mój punkt widzenia "... ale inni wdrażają jakąś inteligentniejszą symulację". Kpiny nie powinny symulować * inteligentniej *. Właśnie dlatego starałem się wskazać, że scenariusz twojego testu zbyt wiele się dzieje, aby efektywnie używać fałszywego schematu. – Gutzofter

Powiązane problemy