2016-04-07 14 views
7

Potrzebuję napisać prostego klienta http. Wspaniale byłoby mieć testy jednostkowe dla mojej klasy. Ale nie wiem, jak napisać właściwą i sprawdzalną klasę.Jak napisać test jednostki dla klienta sieciowego?

Na przykład, Mam klienta tak:

class HTTPClient 
{ 
public: 
    HTTPCLient(const std::string& host, const std::string& port): session(host, port) {} 

    void send() 
    { 
     session.sendRequest(someRequest); 
     Response response = session.receiveResponse(); 
     // ... 
    } 

private: 
    SomeLibrary::ClientSession session; 
}; 

Jak testować send metody (to naprawdę wysłać co chcę)? Nie mogę tego wyśmiać. Mogę napisać, że HTTPClient otrzymuje obiekt SomeLibrary::ClientSession w konstruktorze (w teście chciałbym przejść makiety), ale czy to jest dobry projekt? Myślę, że sposób realizacji sesji itp. Powinien być ukryty w mojej klasie.

Czy masz jakiś pomysł?

Odpowiedz

5

Mogłem napisać bibliotekę klienta HTTP innego dnia.

Aby przetestować bibliotekę klienta HTTP, napisałem prosty kod testowy, który rozpoczął std::thread nasłuchiwanie na losowym porcie na localhost. Następnie powiedziałem klientowi, aby wysłał żądanie testowe z parametrami host i port, tak jak w twoim przypadku, wskazując port, którego mój wątek teraz słuchał. Kod wątku został zaprogramowany do akceptowania połączenia, odczytu żądania HTTP, zapisania go, a następnie odpowiedzi z odpowiedzią HTTP w puszkach.

I tak przetestowałem moją bibliotekę klienta, sprawdzając zarówno faktyczne żądanie klienta, jak i sposób, w jaki klient obsługiwał konserwowaną odpowiedź HTTP. Później opracowałem ten kod testowy jednostki, aby wysyłać różne rodzaje błędów HTTP i źle sformułowane odpowiedzi HTTP, aby przetestować i zweryfikować, w jaki sposób kod klienta radzi sobie z tymi sytuacjami.

I, na dobrą rzecz, całość była strzeżona przez wywołanie alarm(), więc jeśli coś utknęło w nieskończonej pętli, cały proces ostatecznie popełni samobójstwo.

W ten sposób można przetestować własny kod również w ten sam sposób.

0

Wstrzyknij abstrakcyjną instancję sesji klienta w konstruktorze. Wyśmiać go w testach jednostkowych i przekazać rzeczywistą instancję podczas biegu na serio.

Mówisz, że nie możesz wykpić czy to w jednym zdaniu, aw następnym zdaniu możesz powiedzieć - co masz na myśli? Jeśli masz na myśli, że klasa sesji nie jest "twoja", lub że nie można z niej wyśmiać, to czy próbowałeś ją zawinąć w swoją klasę, aby można ją było wyśmiewać?

Mówisz też: "Myślę, że sposób realizacji sesji itp. Powinien być ukryty w mojej klasie".

Twój błąd w tym założeniu jest to, że klasa Chyba masz na myśli HTTPClient, nie ma nic wspólnego z nim - to klasa sesja powinna ukryć własną implementację i że może to zrobić także, jeśli przekazać go jako instancję w konstruktorze, co dodatkowo zwiększa nieskończoną elastyczność.

0

można naśladować prosty serwer HTTP z gniazdem. następujący kod psuedo może pomóc:

1) set up a string to send from the client, take its length in before hand 
2) open a new thread with a socket in it 
3) bind the socket into some port , listen and accept new connection 
4) send the string you have setted with your http client 
5) in the socket side, read until the length you saved has reached, save that string for comparison 
6) send some pre-defined http response 
7) close the socket 
7) close the thread 
8) continue testing, you have the string which the server got, and the string which the client got, and the original strings which these was originated from 

dokładnie taki efekt pakietowego transfer i przekierowań jest łatwe, ale dokładnie taki efekt SSL może być dość trudne. możesz owijać swoje gniazdo pewnym strumieniem protokołu SSL dostarczanym ze strumieniem openSSL lub Boost SSL.

Inną opcją jest użycie już napisanego serwera HTTP na hoście lokalnym. pisanie jednego (tylko do testowania) w Pythonie lub Node.js jest dość łatwe i odpowiednie dla tego zadania testowania. przed uruchomieniem testu aktywuj skrypt serwera (przy pomocy skryptu Node.js, jest to łatwe jako system("node myServer.js")), a po zakończeniu testu zabij ten serwer.

Powiązane problemy