Aplikace poskytující grafické uživatelské rozhraní, se kterým pracuje koncový uživatel - kliká, vyplňuje, potvrzuje, čte atd. V případě frontendu potřebujeme nutně znát níže uvedené nástroje, abychom mohli odhalovat příčiny bugů v aplikaci ve chvíli, kdy něco nefunguje. Teoreticky zde můžeme odhalit i bug, přestože vše funguje :) Naše frontend aplikace je psaná ve Vue.js.
V chrome prohlížeči otevřeme stiskem F12. V ostatních prohlížečích konzole vypadá prakticky totožně a otevírá se většinou také přes F12, případně z menu prohlížeče lze kliknout na "Developer console/tools" nebo obdobně.
V případě, že něco nefunguje na FE jak má, využij především první dvě zmíněné záložky k tomu, abys získal podklady k další investigaci bugu, které ti pomohou ho správně pochopit a adresovat.
Systém běžící na pozadí pod FE, který na FE posílá data, o která si FE řekne. BE je
program
nasazený na serveru (v případě naší aplikace jde o java aplikaci), který nemá grafické
rozhraní, ale má negrafické rozhranní nazývané API, na které se FE dotazuje o data,
která potřebuje zobrazit uživateli na grafickém rozhraní. Jde o program, který přijímá a
odesílá data z/na FE na jedné straně a získává a ukládá do DB nebo odesílá a přijímá
do/z
dalších zdrojových systémů na druhé straně. Vše je znázorněno na obrázku na začátku této
technické
sekce.
BE API (komunikační rozhranní BE) může být implementováno následujícími
nejznámějšími
způsoby. V obou případech však FE komunikuje s BE přes HTTP protokol. To
znamená, že volání vždy obsahuje následující - host/endpoint, hlavičky
(Content-type, Authorization a jiné) a tělo (zasílaná data).
Z pohledu FE testera tedy nezáleží na tom, zda je API REST nebo SOAP, stále se jedná
o http komunikaci mezi FE a BE, kde může být chyba v datech, validacích apod.
POST https://smartqa-findthebug-app-2pjiue27aq-lm.a.run.app/api/v1/customer HTTP/1.1
Accept-Encoding: gzip,deflate
Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdW
Content-Type: application/json
Content-Length: 358
Host: smartqa-findthebug-app-2pjiue27aq-lm.a.run.app
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.5.5 (Java/16.0.1)
{
"firstName": "test",
"lastName": "test",
"dateOfBirth": "1991-09-13",
"sex": "MALE",
"email": "test@test.com",
"phoneNumber": "12345",
"primaryAddress": {
"street1": "test 12",
"street2": "test 13",
"city": "test",
"zip": "123456",
"country": "ANDORRA"
},
"mailingAddress": null
}
HTTP/1.1 201 Created
vary: Origin,Access-Control-Request-Method,Access-Control-Request-Headers
location: /api/v1/customer/6fe3208b-476f-4b4c-87ce-5ee18ad8cc10
pragma: no-cache
expires: 0
x-frame-options: DENY
content-type: application/json
Content-Length: 342
{"id":"6fe3208b-476f-4b4c-87ce-5ee18ad8cc10",
"firstName":"test",
"lastName":"test",
"email":"test@test.com",
"phoneNumber":"12345",
"dateOfBirth":"1991-09-13",
"sex":"MALE",
"primaryAddress":{"id":"f79267d8-7219-4a43-b031-3a00ae09b0b0",
"street1":"test 12",
"street2":"test 13",
"city":"test",
"zip":"123456",
"country":"ANDORRA"},
"mailingAddress":null}
Narozdíl od REST, v případě SOAP, se vždy používá pro komunikaci na API
operace POST a v těle
http požadavku jsou vždy zasílána data v definovaném formátu. Webová služba
má jen jeden endpoint, na který voláme. To, jakou konkrétní operaci voláme,
rozlišujeme právě v těle požadavku.
U SOAP se vždy posílají data v http body a v tomto smyslu je odůvodnitelné
výhradní použití metody POST.
Příklad veřejně dostupné SOAP webové služby nalezneš
ZDE.
Zkus si stáhnout aplikaci SoapUI, naimportuj WSDL vložením odkazu
výše a
uvidíš, jak vypadají requesty a response v případě komunikace na
SOAP službu. Je zde také možné si zobrazit, jak vypadá samotný http
request a response, což může být velice užitečné ke zorientování se v
problematice http protokolu v kontextu webových služeb.
POST http://webservices.oorsprong.org/websamples.countryinfo/CountryInfoService.wso HTTP/1.1
Accept-Encoding: gzip,deflate
Content-Type: text/xml;charset=UTF-8
Content-Length: 326
Host: webservices.oorsprong.org
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.5.5 (Java/16.0.1)
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://www.oorsprong.org/websamples.countryinfo">
<soapenv:Header/>
<soapenv:Body>
<web:CapitalCity>
<web:sCountryISOCode>CZE</web:sCountryISOCode>
</web:CapitalCity>
</soapenv:Body>
</soapenv:Envelope>
HTTP/1.1 200 OK
Cache-Control: private, max-age=0
Content-Type: text/xml; charset=utf-8
Vary: Accept-Encoding
Server: Microsoft-IIS/8.5
Web-Service: DataFlex 19.1
Date: Wed, 19 Oct 2022 14:01:29 GMT
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<m:CapitalCityResponse xmlns:m="http://www.oorsprong.org/websamples.countryinfo">
<m:CapitalCityResult>Prague</m:CapitalCityResult>
</m:CapitalCityResponse>
</soap:Body>
</soap:Envelope>
Proč je aplikace rozdělena na FE a BE? Proč to všechno nemůže být dohromady? Mohlo
by.
FE aplikace by mohla být přímo napojena na zdrojové systémy (DB, BEs třetích stran)
bez toho, aniž by mezi tím byl jiný BE. V tom případě by se však FE musel často
přenasazovat a
upravovat i kvůli změnám, které nejsou spjaty přímo s UI.
Zkrátka historie a praxe ukázala, že je
lepší tyto systémy oddělit a být tak agilnější/obratnější v implementaci potřebných
změn a úprav napříč aplikačními vrstvami.
Zde se ukládají všechna data, která chceme v aplikaci držet. Backend tato data poskytuje v případě potřeby na FE a také data z FE posílá do DB k uložení. V případě naší aplikace používáme relační SQL databázi postgres, do které můžeš sám přímo nahlížet.
The application that provides a graphical user interface that the end user works with -
he clicks, enters the data, submits, reads, etc.
As testers we need to know following features and facts in case of frontend in order to
we to be able to discover the
defect causes in the situations when something does not work. Theoretically we can also
find there the bugs despite everything works well :)
Our app is implemented in Vue.js.
In the chrome browser we can open it by pressing F12. In other browsers the console looks very similar and opening is also by pressing F12 or we can just open it from the browser menu by clicking on the button with the label "Developer console/tools" or something like that.
When something is failing on UI or does not work as expected use mainly first two tabs mentioned above. You will get valuable information from these sections of the browser developer console that helps you to understand the cause of the bug and it helps you to address the bug properly.
The system sitting under the FE that provides the data to UI app upon the UI request.
It is an application running on the server (in case of our application it is java
application) that hasn't any graphical interface but it has an API that UI app is using
for getting the data and displaying them on the graphical interface.
It receives and sends the data to FE on one side and it sends and receives the data
to/from DB or other backends on second side. See the diagram above that represents the
architecture and the data flows.
BE API (BE communication interface) can be implemented in two most often ways described
below.
In both cases the communication between FE and BE runs via HTTP protocol which
means that the calls contain always following parts - host/endpoint, http headers
(Content-type, Authorization etc.) and the body (containing the application data).
From the tester's perspective it does not matter if the BE API is implemented using REST
or SOAP. It is still http communication between FE and BE where can be the discrapencies
in data, validations and others.
POST https://smartqa-findthebug-app-2pjiue27aq-lm.a.run.app/api/v1/customer HTTP/1.1
Accept-Encoding: gzip,deflate
Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdW
Content-Type: application/json
Content-Length: 358
Host: smartqa-findthebug-app-2pjiue27aq-lm.a.run.app
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.5.5 (Java/16.0.1)
{
"firstName": "test",
"lastName": "test",
"dateOfBirth": "1991-09-13",
"sex": "MALE",
"email": "test@test.com",
"phoneNumber": "12345",
"primaryAddress": {
"street1": "test 12",
"street2": "test 13",
"city": "test",
"zip": "123456",
"country": "ANDORRA"
},
"mailingAddress": null
}
HTTP/1.1 201 Created
vary: Origin,Access-Control-Request-Method,Access-Control-Request-Headers
location: /api/v1/customer/6fe3208b-476f-4b4c-87ce-5ee18ad8cc10
pragma: no-cache
expires: 0
x-frame-options: DENY
content-type: application/json
Content-Length: 342
{"id":"6fe3208b-476f-4b4c-87ce-5ee18ad8cc10",
"firstName":"test",
"lastName":"test",
"email":"test@test.com",
"phoneNumber":"12345",
"dateOfBirth":"1991-09-13",
"sex":"MALE",
"primaryAddress":{"id":"f79267d8-7219-4a43-b031-3a00ae09b0b0",
"street1":"test 12",
"street2":"test 13",
"city":"test",
"zip":"123456",
"country":"ANDORRA"},
"mailingAddress":null}
In case of SOAP there is always used the http method POST for the communication
to the API from the client side. In the http request body there is always the
data and therefore
from this point of view it makes sense that it is using only POST. SOAP web
service has one endpoint. The
operation that we call is specified in the http message body itself.
Find the publicly available SOAP service
HERE.
You can try to download and install SoapUI app and to import the
WSDL file (link above). SoapUI will generate SOAP project for you and
you
can call the BE operations simply from there. You can check how the
requests and responses look like. You have also possibility to view the
raw http request and response which is very helpful.
POST http://webservices.oorsprong.org/websamples.countryinfo/CountryInfoService.wso HTTP/1.1
Accept-Encoding: gzip,deflate
Content-Type: text/xml;charset=UTF-8
Content-Length: 326
Host: webservices.oorsprong.org
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.5.5 (Java/16.0.1)
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://www.oorsprong.org/websamples.countryinfo">
<soapenv:Header/>
<soapenv:Body>
<web:CapitalCity>
<web:sCountryISOCode>CZE</web:sCountryISOCode>
</web:CapitalCity>
</soapenv:Body>
</soapenv:Envelope>
HTTP/1.1 200 OK
Cache-Control: private, max-age=0
Content-Type: text/xml; charset=utf-8
Vary: Accept-Encoding
Server: Microsoft-IIS/8.5
Web-Service: DataFlex 19.1
Date: Wed, 19 Oct 2022 14:01:29 GMT
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<m:CapitalCityResponse xmlns:m="http://www.oorsprong.org/websamples.countryinfo">
<m:CapitalCityResult>Prague</m:CapitalCityResult>
</m:CapitalCityResponse>
</soap:Body>
</soap:Envelope>
Why the application is divided into FE and BE? Why everything is not implemented
together in FE for example? It could be.
FE application could directly access the database or
other systems without an extra intermediator. But in that situation there would be an
inconvenience during the changes or fixes deployments. You would have to deploy whole FE
application despite the fact that you would do the changes that are not related to UI.
The history
and experience has shown that it is better to separate the layers of the application in
order to be more agile during the changes or fixes implementation across these layers.
In the database the application keeps all the data that we want to keep. Backend provides this data to FE and sends the FE data to DB in case of need. In our application we use the relation SQL database postgres. You can view the data directly in the database in our app. You will get the direct access.