rest api testing with spring resttemplate
Ten szczegółowy samouczek wyjaśnia, jak rozpocząć testowanie REST API za pomocą Spring RestTemplate i TestNG z prostymi przykładami:
W tym artykule zobaczymy, jak rozpocząć testowanie REST API przy użyciu struktury RestTemplate i TestNG.
Przed zapoznaniem się z testowaniem REST API za pomocą RestTemplate i frameworku TestNG, pozwól nam zrozumieć niektóre z podstawowych pojęć z tym związanych.
Zaczynajmy!!
Czego się nauczysz:
- Co to jest REST?
- Co to jest JSON?
- Co to jest testowanie REST API?
- Co to jest TestNG?
- Co to jest szablon Spring REST?
- Kroki testowania REST API
- Konfigurowanie struktury testowej TestNG w systemie Windows
- Pełny kod pliku TestCRUD
- Wniosek
- rekomendowane lektury
Co to jest REST?
W dzisiejszych czasach REST stał się dość popularnym sposobem budowania usług internetowych. Na przykład , Google ma wiele usług REST, takich jak Kalendarz, Map API itp.
ODPOCZYNEK to znaczy Reprezentacyjny transfer państwowy to styl architektoniczny oprogramowania. W tym stylu definiowany jest zestaw ograniczeń, a do ich spełnienia wymagane są zbudowane usługi internetowe. Takie usługi sieciowe zgodne ze stylem architektury REST są nazywane usługami sieciowymi RESTful.
Termin „Reprezentacyjny transfer państwa” został po raz pierwszy przedstawiony przez Roy Fielding w swoim Ph.D. rozprawa z 2000 roku. Podstawową ideą REST jest traktowanie obiektów po stronie serwera jako zasobów, które można tworzyć lub usuwać.
Co to jest JSON?
JSON to znaczy Notacja obiektu JavaScript jest bardzo często używaną składnią w usługach REST do przechowywania i wymiany danych między przeglądarką a serwerem.
Główną zaletą JSON jest jego niewielka waga, a po drugie czytelny format. Dane są przechowywane w formacie pary klucz: wartość. Na przykład, możesz mieć dane pracowników przechowywane w formacie JSON w następujący sposób: {„name”: ”Emp1 ″,” wynagrodzenie ”:” 3000 ″, ”age”: ”23 ″,” id ”:” 52686 ″}.
Co to jest testowanie REST API?
Kiedy mówimy o testowaniu REST API, chodzi w zasadzie o testowanie interfejsu API poprzez wykonywanie akcji Create, Edit, Read i Delete na zasobie za pomocą 4 głównych metod, tj. Odpowiednio POST, GET, PUT i DELETE
Co to jest TestNG?
TestNG to platforma testowa inspirowana JUnit i NUnit. Jest przeznaczony dla języka programowania Java. TestNG obejmuje szerszy zakres kategorii testów, takich jak jednostka, funkcjonalność, kompleksowość, integracja itp.
Jest to platforma open source objęta licencją Apache. Zawiera bogaty zestaw adnotacji, które przyspieszają tworzenie skryptów testowych.
Co to jest szablon Spring REST?
Klasa Spring RestTemplate jest częścią spring-web, która została wprowadzona w Spring 3
Klasa RestTemplate zapewnia bardzo wygodny sposób testowania usług WWW opartych na protokole HTTP, udostępniając przeciążone metody dla metod HTTP, takich jak GET, POST, PUT, DELETE, itp. Framework Spring jest również oprogramowaniem typu open source.
Kroki testowania REST API
Pozwól nam zrozumieć kroki, które są zwykle wykonywane w testowaniu interfejsu API REST, z kilkoma przykładami, aby uzyskać jasne zrozumienie.
W tym artykule rozważałem jedną przykładową usługę pracowniczą REST API z to źródło.
Najpierw wykonajmy kroki ręcznie za pomocą narzędzia POSTMAN.
# 1) Najpierw poznaj punkt końcowy interfejsu API, do którego chcesz uzyskać dostęp.
Na przykład, http://dummy.restapiexample.com/api/v1/create, aby utworzyć nowy zasób pracownika
#dwa) Ustaw nagłówki i treść, jeśli jest to wymagane dla metody HTTP.
W naszym przykładzie, gdy próbujemy utworzyć nowy zasób za pomocą POST. W przypadku POST wymagana jest treść żądania.
Więc ustawimy ciało w następujący sposób:
„Name”: „zozo100 ″,„ pensja ”:„ 123 ″, „age”: „23 ″
Zaakceptować : aplikacja / JSON i Typ zawartości : aplikacja / JSON.
najlepsza zapora ogniowa dla systemu Windows 7 w wersji 64-bitowej
# 3) Ustaw odpowiednią metodę HTTP, czyli POST w tym przypadku.
# 4) Wyślij żądanie do serwera usługi Rest.
# 5) Odbierz odpowiedź z serwera.
Wywołanie REST API za pomocą narzędzia POSTMAN
# 6) Sprawdź odpowiedź zgodnie z oczekiwaniami, korzystając z kodu odpowiedzi Na przykład. 200 OK jako sukces.
# 7) W razie potrzeby sprawdź treść odpowiedzi zgodnie z oczekiwaniami, porównując ją z plikiem testu porównawczego.
Teraz musimy zautomatyzować te same kroki dla naszego zestawu do automatyzacji testów. Zacznijmy od konfiguracji wymaganej do automatyzacji.
Konfigurowanie struktury testowej TestNG w systemie Windows
# 1) Instalacja
- Zamierzamy używać Javy do tworzenia skryptów testowych. Więc pierwsze pobranie Instalator JDK dla systemu Windows i zainstaluj Javę na swoim komputerze.
- IDE (zintegrowane środowisko programistyczne) : Użyłem Eclipse jako IDE do tworzenia pakietu Automation Test Suite. Kliknij tutaj aby go pobrać.
- Pobierz wtyczkę Eclipse do TestNG: Należy pamiętać, że do uruchomienia TestNG dla wtyczki Eclipse wymagana jest Java 1.7+. Wymagane jest Eclipse 4.2 i nowsze. (Odniesienie: TestNG ). Wykonaj poniższe kroki w Eclipse:
- Wybierz Pomoc / Zainstaluj nowe oprogramowanie.
- Kliknij Dodaj -> Wpisz http://beust.com/eclipse/
- Zaznacz pole wyboru obok adresu URL i kliknij przycisk Dalej.
Instalacja TestNG
-
- Klikaj przycisk Dalej, aż dojdziesz do następnego ekranu.
Ekran końcowy instalacji TestNG
Na koniec zaakceptuj umowę licencyjną Apache i kliknij przycisk Zakończ, aby zakończyć instalację.
Zrestartuj Eclipse, aby zastosować instalację wtyczki.
- Wiosenne słoiki: Teraz jeszcze jedna rzecz, użyjemy klasy RestTemplate z frameworka wiosennego. Możesz pobierz słoiki wiosenne i zapisz go w folderze lokalnym, Na przykład ,C: / projectJar
- Jars JSON-Simple: Musimy przeprowadzić analizę JSON. W tym celu użyjemy prostego interfejsu API w języku Json. Więc pobierz Json-simple-1.1.jar do C: / projectJar
Teraz zakończyliśmy niezbędne instalacje. Stwórzmy więc nasz projekt Test Automation.
# 2) Konfiguracja projektu
- Utwórz plik -> Nowy -> Projekt Java -> Nazwij go jako „ EmployeeTestSuite ”.
- Teraz utwórz nowy pakiet java com.demo :
- Skonfiguruj ścieżkę kompilacji:
- Jak widzieliście we wcześniejszej sekcji, zainstalowaliśmy TestNG, pobrane sprężyny i proste słoiki JSON. Więc teraz musimy dodać ścieżkę kompilacji w naszym projekcie, aby je wykorzystać. W tym celu utwórz plik lib folder w pakiet EmployeeTestSuite a teraz skopiuj wszystkie pliki JAR z C: / projectJar do pliku lib teczka.
- Kliknij prawym przyciskiem myszy „ EmployeeTestSuite ”” -> Ścieżka budowania -> Konfiguruj ścieżkę budowania.
- Kliknij na lib patka.
- Kliknij na Dodaj bibliotekę przycisk -> Wybierz TestNG. Spowoduje to dodanie TestNG do ścieżki kompilacji.
- Kliknij Dodaj słoiki przycisk -> Wybierz wszystkie słoiki z lib. Spowoduje to dodanie wszystkich słoików wiosennych i prostego słoika JSON do ścieżki kompilacji projektu.
Ścieżka budowania Java
Twoja struktura projektu będzie teraz wyświetlana w Eksploratorze pakietów Eclipse w następujący sposób.
Struktura pakietu
# 3) Klasa testowa
Musimy utworzyć klasę Test, która może obejmować operacje CRUD (Create-Read-Update-Delete).
Utwórz nową klasę Plik -> Nowa -> Klasa TestNG i nazwij ją TestCRUD.java
# 4) Metoda testowa
Stwórzmy osobne metody testowe:
- addEmployee (): Metoda testowa do testowania Create API przy użyciu metody HTTP POST.
- getEmployee (): Metoda testowa do testowania Read API przy użyciu metody HTTP GET.
- updateEmployee (): Metoda testowa do testowania interfejsu API aktualizacji przy użyciu metody HTTP PUT.
- deleteEmployee (): Metoda testowa do testowania interfejsu API Delete przy użyciu metody HTTP DELETE.
Możesz utworzyć metodę testową jako dowolną metodę java tylko z adnotacją @Test dotyczącą TestNG, aby została zidentyfikowana jako metoda testowa przez platformę TestNG
Na przykład,Poniżej przedstawiono metodę testową addEmployee.
@Test public void addEmployee () {}
W naszym przykładzie użyłem pliku przykładowa usługa REST.
Teraz zautomatyzujmy wywołanie POST. W tym celu musimy zmapować nasz kod za pomocą kroków, które wykonaliśmy ręcznie w sekcji „Kroki testowania interfejsu API REST” jeden po drugim.
# 1) Najpierw poznaj punkt końcowy interfejsu API, do którego chcesz uzyskać dostęp.
String addURI = 'http://dummy.restapiexample.com/api/v1/create';
#dwa) Ustaw nagłówki dla metody HTTP.
HttpHeaders headers = new HttpHeaders();
// Dodaj nagłówki
headers.add('Accept', 'application/json'); headers.add('Content-Type', 'application/json');
Ustaw treść dla metody HTTP.
String jsonBody = '{'name':'zozo100','salary':'123','age':'23'}';
// Utwórz obiekt HttpEntity, ustawiając treść i nagłówki.
HttpEntity entity = new HttpEntity(jsonBody, headers);
Poniższe kroki będziemy mieli zautomatyzować w jednym oświadczeniu.
# 3) Ustaw odpowiednią metodę HTTP, czyli POST w tym przypadku.
# 4) Wyślij żądanie do serwera usługi RESTful.
# 5) Odbierz odpowiedź z serwera.
RestTemplate restTemplate = new RestTemplate(); ResponseEntity response =restTemplate.postForEntity(addURI, entity, String.class);
Używamy postForEntity aby wysłać metodę POST do serwera. Otrzymujemy odpowiedź z obiektu serwera ResponseEntity.
# 6) Sprawdź odpowiedź zgodnie z oczekiwaniami, korzystając z kodu odpowiedzi.
Assert.assertEquals(response.getStatusCode(), HttpStatus.OK);
Tutaj używamy klasy narzędzia Assert TestNG, aby zweryfikować metodę assertEquals kodu stanu, która porównuje rzeczywistą wartość, tj. Response.getStatusCode (), z oczekiwaną wartością HttpStatus.OK.
Ale tutaj robimy jeszcze jedną weryfikację, tj.Weryfikację, czy dodany Pracownik jest obecny w treści odpowiedzi, czy nie.
Assert.assertTrue(responseBody.contains(employeeId));
Jak uzyskaliśmy identyfikator pracownika?
W tym celu korzystamy z API parsera JSON, czyli Json-simple.
Używamy parsera JSON, ponieważ format JSON służy do przechowywania i wymiany danych między klientem a naszym serwerem w naszej usłudze REST dla pracowników. Jak wspomniano wcześniej, dane JSON są przechowywane w plikach kluczowa wartość format. Tutaj chcemy uzyskać 'ID' wartość.
Otrzymamy go, analizując treść odpowiedzi w następujący sposób:
JSONParser parser = new JSONParser(); // Instantiate JSONParser object JSONObject jsonResponseObject = new (JSONObject) parser.parse(jsonString); //Parse jsonString i.e. Response body string in json format to JSON object String employeeId = jsonResponseObject.get('id').toString(); // Get id attribute
Więc to wszystko dotyczy testu metody Create.
Aktualizuj, pobierz i usuń metody
- Utwórz oddzielne metody testowe i ustaw odpowiednio nagłówki.
- Weryfikacja kodu statusu również przebiega podobnie.
- Główną różnicą są metody wysyłania żądania do serwerów.
Możesz użyć następujących metod:
1) Zaktualizuj pracownika : Jest to żądanie HTTP PUT. Metoda RestTemplate PUT, której możesz użyć, to:
public void put(String url,Object request, Object... urlVariables) throws RestClientException
# 2) Zdobądź pracownika: Jest to żądanie HTTP GET. Metoda RestTemplate GET, której możesz użyć, jest następująca:
public ResponseEntity getForEntity(String url, Class responseType, Object... urlVariables) throws RestClientException
# 3) Usuń zasoby pracownika: Jest to żądanie HTTP DELETE. Metoda RestTemplate DELETE, której możesz użyć, to:
public void delete(String url, Object... urlVariables) throws RestClientException
Oprócz tych metod istnieją przydatne metody exchange () i execute ().
Na przykład, jeśli zauważysz, metoda Delete jest nieważna. Ale jeśli chcesz zweryfikować treść odpowiedzi, potrzebujesz odpowiedzi zwrotnej z wykonania metody. W tym celu możesz użyć metody exchange (), która zwraca ResponseEntity. Zapoznaj się z Ramy wiosenne po więcej szczegółów.
# 5) Przeprowadzanie testów
Zakończyliśmy już zadanie tworzenia skryptów testowych, więc uruchommy nasze testy. Wystarczy kliknąć prawym przyciskiem myszy TestCRUD.java i wybierz opcję „Uruchom jako test TestNG” .
Spowoduje to wyświetlenie wyników wykonania testu w następujący sposób.
Wyjście konsoli
Uwaga: Możesz zdefiniować swój zestaw testów w testng.xml plik. W naszym przykładzie jest to tylko jeden skrypt testowy. Ale w prawdziwym scenariuszu jest to zawsze zbiór wielu skryptów.
Więc twój plik testg.xml będzie wyglądał następująco:
# 6) Raporty
Wynik widzieliśmy na konsoli. Ale TestNG zapewnia wyniki testów w bardziej reprezentatywnym formacie HTML, który można udostępnić zainteresowanym stronom. otwarty wyjście testowe -> emailable-report.html w przeglądarce.
Zobaczysz raport z testu w następujący sposób. Na stronie raportu możesz zobaczyć nazwę testu jako TestCRUD, kilka pozytywnych testów, tj.4, Liczba pominiętych i nieudanych, które w tym przypadku wynoszą 0. Pokazuje również całkowity czas wymagany do wykonania każdej metody testowej.
Wynik testu w formacie HTML
Pełny kod pliku TestCRUD
package com.demo; import java.io.IOException; import java.text.ParseException; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.client.RestTemplate; import org.testng.Assert; import org.testng.annotations.AfterTest; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; import org.testng.log4testng.Logger; /** * This test class has test methods for CRUD actions on REST API * REST Service http://dummy.restapiexample.com/api * * It has test methods for Create , Edit , Get and Delete Employee items * https://docs.spring.io/spring-framework/docs/current/javadoc- api/org/springframework/web/client/RestTemplate.html * https://docs.spring.io/autorepo/docs/spring/3.2.3.RELEASE/javadoc- api/org/springframework/web/client/RestTemplate.html * @author * */ public class TestCRUD { private String responseBody; public String responseBodyPOST; final static Logger logger = Logger.getLogger(TestCRUD.class); //RESTTemplate Object private RestTemplate restTemplate; //Employee ID private String employeeId; // Create Response Entity - Stores HTTPStatus Code, Response Body, etc private ResponseEntity response; @BeforeTest public void beforeTest() throws IOException, ParseException { logger.info('Setting up prerequisite for test execution'); logger.info('Creating RestTemplate object before tests'); this.restTemplate = new RestTemplate(); } /** * Test Method to add employee using HTTP POST request * * Verifies POST action Status Code * * @throws IOException * @throws ParseException */ @Test public void addEmployee() throws IOException, ParseException { String addURI = 'http://dummy.restapiexample.com/api/v1/create'; HttpHeaders headers = new HttpHeaders(); headers.add('Accept', 'application/json'); headers.add('Content-Type', 'application/json'); logger.info('Add URL :'+addURI); String jsonBody = '{'name':'zozo100','salary':'123','age':'23'}'; System.out.println('
' + jsonBody); HttpEntity entity = new HttpEntity(jsonBody, headers); //POST Method to Add New Employee response = this.restTemplate.postForEntity(addURI, entity, String.class); responseBodyPOST = response.getBody(); // Write response to file responseBody = response.getBody().toString(); System.out.println('responseBody --->' + responseBody); // Get ID from the Response object employeeId = getEmpIdFromResponse(responseBody); System.out.println('empId is :' + employeeId); // Check if the added Employee is present in the response body. Assert.assertTrue(responseBody.contains(employeeId)); // System.out.println(propertyFile.get('EmployeeAddResBody')); // Check if the status code is 201 Assert.assertEquals(response.getStatusCode(), HttpStatus.OK); logger.info('Employee is Added successfully employeeId:'+employeeId); } /** * Method to get Employee ID from REsponse body * I have used Json Simple API for Parsing the JSON object * * @param json * @return */ public static String getEmpIdFromResponse(String json) { JSONParser parser = new JSONParser(); JSONObject jsonResponseObject = new JSONObject(); Object obj = new Object(); try { obj = parser.parse(json); } catch (org.json.simple.parser.ParseException e) { e.printStackTrace(); } jsonResponseObject = (JSONObject) obj; String id = jsonResponseObject.get('id').toString(); return id; } /** * Test Method to Update employee using HTTP PUT request * * Verifies PUT action Status Code * Verifies Updated Name exists in Response Body * * @throws IOException * @throws ParseException */ @Test(dependsOnMethods = 'addEmployee', enabled = true) public void updateEmployee() throws IOException, ParseException { String updateURI = 'http://dummy.restapiexample.com/api/v1/update/'+employeeId; logger.info('Update URL :'+updateURI); String jsonBody = responseBodyPOST; jsonBody = jsonBody.replace('zozo100', 'update_zozo100'); HttpHeaders headers = new HttpHeaders(); headers.add('Accept', 'application/json'); headers.add('Content-Type', 'application/json'); HttpEntity entity = new HttpEntity(jsonBody, headers); //PUT Method to Update the existing Employee //NOTE that I have Not used restTemplate.put as it's void and we need response for verification response = restTemplate.exchange(updateURI, HttpMethod.PUT, entity, String.class); responseBody = response.getBody().toString(); System.out.println('Update Response Body :'+responseBody); // Check if the updated Employee is present in the response body. Assert.assertTrue(responseBody.contains('update_zozo100')); // Check if the status code is 200 Assert.assertEquals(response.getStatusCode(), HttpStatus.OK); logger.info('Employee Name is Updated successfully employeeId:'+employeeId); } /** * Test Method to Get employee using HTTP GET request * * Verifies GET action Status Code * Verifies Name exists in Response Body * * @throws IOException * @throws ParseException */ @Test(dependsOnMethods = 'updateEmployee', enabled = true) void getEmployee() throws IOException, ParseException { String getURI = 'http://dummy.restapiexample.com/api/v1/employee/'+this.employeeId; logger.info('Get URL :'+getURI); HttpHeaders headers = new HttpHeaders(); HttpEntity entity = new HttpEntity(headers); //GET Method to Get existing Employee response = restTemplate.getForEntity(getURI,String.class); // Write response to file responseBody = response.getBody().toString(); //Suppressing for log diffs System.out.println('GET Response Body :'+responseBody); // Check if the added Employee ID is present in the response body. Assert.assertTrue(responseBody.contains('update_zozo100')); // Check if the status code is 200 Assert.assertEquals(response.getStatusCode(), HttpStatus.OK); logger.info('Employee is retrieved successfully employeeId:'+employeeId); } /** * Test Method to Delete employee using HTTP DELETE request * * Verifies DELETE action Status Code * Verifies Success Message Text in Response Body * * @throws IOException * @throws ParseException */ @Test(dependsOnMethods = 'getEmployee', enabled = true) public void deleteEmployee() throws IOException, ParseException { String delURI = 'http://dummy.restapiexample.com/api/v1/delete/'+this.employeeId; HttpHeaders headers = new HttpHeaders(); HttpEntity entity = new HttpEntity(headers); //DELETE Method to Delete existing Employee response = restTemplate.exchange(delURI, HttpMethod.DELETE, entity, String.class); // Check if the status code is 204 Assert.assertEquals(response.getStatusCode(), HttpStatus.OK); responseBody = response.getBody(); Assert.assertEquals(getMessageFromResponse(responseBody), 'successfully! deleted Records'); logger.info('Employee is Deleted successfully employeeId:'+employeeId); } /** * Gets 'text' key value from Response body text for verification * I have used Json Simple API for Parsing the JSON object * * @param json * @return text string */ public static String getMessageFromResponse(String json) { String successMessageText = null; try { JSONParser parser = new JSONParser(); JSONObject jsonResponseObject = new JSONObject(); jsonResponseObject = (JSONObject) (parser.parse(json)); String successMessage = jsonResponseObject.get('success').toString(); jsonResponseObject = (JSONObject) (parser.parse(successMessage)); successMessageText = jsonResponseObject.get('text').toString(); } catch (org.json.simple.parser.ParseException e) { e.printStackTrace(); } return successMessageText; } @AfterTest public void afterTest() { logger.info('Clean up after test execution'); logger.info('Creating RestTemplate object as Null'); this.restTemplate = new RestTemplate(); } }
Wniosek
Poniżej podsumowaliśmy wyniki nauczania tego artykułu. Od początku widzieliśmy wszystkie kroki, aby skonfigurować strukturę automatyzacji testów interfejsu API REST.
najlepszy system sprzedaży dla iPada
W ten sposób dowiedzieliśmy się, co następuje:
- Do automatyzacji testów wybraliśmy Javę jako język programowania.
- Wybraliśmy TestNG jako platformę testową do tworzenia skryptu testowego, w którym używaliśmy adnotacji TestNG, takich jak @Test.
- Do wysyłania rzeczywistych żądań HTTP do serwera wykorzystaliśmy klasę Spring Framework RestTemplate.
- Aby korzystać z tych interfejsów API, zainstalowaliśmy TestNG, pobraliśmy Spring Jars i Json-simple jar dla API parsera.
- Na koniec uruchomiliśmy klasę Test i zobaczyliśmy wynik na konsoli, a także w bardziej reprezentacyjnym i czytelniejszym formacie HTML.
W skrócie, w tym artykule dowiedzieliśmy się, jak rozpocząć automatyzację testów REST API za pomocą Spring RestTemplate. Omówiliśmy konfigurację naszego szkieletu automatyzacji testów, zaczynając od instalacji całego niezbędnego oprogramowania, konfiguracji projektu, tworzenia skryptów testowych aż do wykonania testów i przeglądania wygenerowanych raportów.
Jest to wystarczające, aby każda kontrola jakości automatyzacji mogła rozpocząć pracę z ramą automatyzacji testów. Ale widzieliśmy tylko wymagane części z każdego, na przykład użyliśmy instalacji TestNG, metody testowej z użyciem adnotacji @Test, raportów. Jednak TestNG zapewnia o wiele więcej funkcji, takich jak DataProvider do testowania opartego na danych itp.
Czy jesteś gotowy, aby rozpocząć automatyzację testów REST API za pomocą Spring RestTemplate?
rekomendowane lektury
- 10 najlepszych narzędzi do testowania API w 2021 r. (Narzędzia testowe SOAP i REST API)
- Najlepsze narzędzia do testowania oprogramowania 2021 (Narzędzia do automatyzacji testów QA)
- Testing Primer Pobierz eBook
- 20 najważniejszych pytań i odpowiedzi do wywiadów dotyczących testowania API
- Upraszczanie testowania API w Katalon Studio
- Parasoft SOAtest Tutorial: Bezskryptowe narzędzie do testowania API
- Testowanie obciążenia za pomocą samouczków HP LoadRunner
- Różnica między testami na komputerach stacjonarnych, serwerach klienckich i testach internetowych