Blog Canoo Webtest: neštandardné testy využitím Javascriptu a Ruby + Bonus

Canoo Webtest: neštandardné testy využitím Javascriptu a Ruby + Bonus

To, čo nejde otestovať štandardne, otestujeme naprogramovaním vlastnej testovacej logiky. Na špecifické prípady, ktoré sa nedajú jednoznačne otestovať pomocou štandardných prostriedkov canoo WebTest, je určený špeciálny testovací krok – <scriptStep>.

ScriptStep poskytuje možnosť napísať vlastný skriptovací kód, ktorý otestuje správnosť údajov na webe v niektorom zo skriptovacích jazykov. Tento jazyk však musí byť podporovaný “BSF (Bean Scripting Framework)“. Napríklad JavaScript, Python (buď s použitím Jython alebo JPython, XSLT štýly, Java (pomocou BeanShell), JRuby, Groovy, alebo ObjectScript.

BSF (Bean Scripting Framework) je sada Java tried, ktoré poskytujú podporu v rámci skriptovacieho jazyka a prístup k Java objektom a metódam zo skriptovacích jazykov. Toto je dosiahnuté poskytnutím API, ktoré umožňuje volať skriptovací jazyk zvnútra Javy.

Canoo WebTest obsahuje všetky potrebné súbory na podporu Groovy a JavaScript-u. Pre ostatné jazyky je potrebné stiahnutie príslušných súborov. Spravidla sa však jedná len o jeden jar súbor, ktorý je potrebné skopírovať do  webtest-classpath.

Ale dosť teórie, poďme si ukázať na čo je to všetko dobré. Na použite vlastného scriptStep-u si predstavme imaginárnu stránku, na ktorej je objednávka s položkami nákupu.

Canoo Webtest: neštandardné testy využitím Javascriptu a Ruby + Bonus

Teraz si predstavme test, ktorého úlohou je otestovanie správnosti zobrazených údajov. Konkrétne či v treťom stĺpci “Množstvo” je skutočne súčin prvého stĺpca “Množstvo” a stĺpca “Jednotková cena”. Ďalej, či sú súčty v riadku “Total” naozaj správnymi súčtami jednotlivých položiek.

Na takýto test použijeme scriptStep – ktorého kód napíšeme v skriptovacom jazyku javascript:

<webtest name="scriptStep: testuje spravnost dat zobrazenych na objednavke">
    <steps>
        <invoke description="url stranky s objednavkou" url="test-1.html"/>
        <scriptStep description="spocitaj mnozstva a ceny" language="javascript"> 
            calc_qty = 0; 
            calc_price = 0; 
            items = document.getHtmlElementsByAttribute('tr', 'class', 'lineitem').iterator(); 
            while (items.hasNext()) {
                table_cells = items.next().getHtmlElementsByTagName('td'); 
                qty = parseInt(table_cells.get(1).asText()); 
                unit_price = parseInt(table_cells.get(2).asText()); 
                total_line_price = parseInt(table_cells.get(3).asText()); 
                calc_qty += qty; calc_price += total_line_price; 
                if (qty * unit_price != total_line_price) { 
                    step.setWebtestProperty('calc_error_found', 'true'); 
                }
            }
            step.setWebtestProperty('calc_qty', calc_qty); 
            step.setWebtestProperty('calc_price', calc_price); 
        </scriptStep>
        <not>
            <verifyProperty name="calc_error_found" text="true"/>
        </not>
        <verifyXPath description="kontrola celkoveho mnozstva" 
            xpath="//tr[@class='total']/td[2]" text="#{calc_qty}"/>
        <verifyXPath description="kontrola celkovej ceny"      
            xpath="//tr[@class='total']/td[4]" text="#{calc_price}"/>
    </steps>
</webtest>

Teraz ale skúsime niečo dosť špeciálne. Predstavme si stránku, na ktorej je číslo. Test má zistiť, či je toto číslo z Fibonacciho postupnosti.

Canoo Webtest: neštandardné testy využitím Javascriptu a Ruby + Bonus

Na takýto test použijeme scriptStep – ktorého kód napíšeme v skriptovacom jazyku Ruby:

<target name="testFibonacciRuby">
  <webtest name="scriptStepManualTests: ruby test cisla">
    <steps>
      <invoke description="url stranky" url="test-2.html"/>
      <storeXPath description="extrahuj cislo na testovanie"
        xpath="//span[@id='fibonacci']/text()"
        property="number"/>
      <scriptStep description="skontroluj, ci je cislo z fibonacciho postupnosti" language="ruby">
          <![CDATA[
            def isFib(n)
              a, b = 0, 1
              a, b = b, a + b while b < n
              return n == 0 || b == n
            end
            $bsf.lookupBean("step").setWebtestProperty("found", "true") if isFib(#{number})
          ]]>
      </scriptStep>
      <verifyProperty name="found" text="true" />
    </steps>
  </webtest>
</target>

Myslím, že zavedením scriptStep-u sa výrazne zvýšila sila WebTestu. Každopádne je teraz umožnené tvorcom testovacích scenárov, aby mohli otestovať naozaj nevšedné “features”, ktoré sa môžu objavovať na testovaných weboch.

Bonusovým vylepšením Canoo WebTest je rozšírenie reportov o zoznam pomaly sa zobrazujúcich stránok [server response]. Táto nová možnosť zatiaľ nie je súčasťou oficiálnej release – zatiaľ stále čaká na implementáciu v riadnej release. Ja však pre čitateľov robime.it uvádzam toto rozšírenie.

Implementuje sa v súbore:

/build/resources/WebTestReport.xsl

Do tohto súboru sa doplní šablóna/template “show-time-problems“, ktorá na koniec každého WebTest reportu zobrazí tabuľku so zoznamom farebne rozlíšených stránok, ktorých zobrazenie v prehliadači trvalo viac ako 1500,  3000, 5000, 10000 milisekúnd.

<xsl:template name="show-time-problems">
	<xsl:variable name="requestSteps"
		select="//step[starts-with(@taskName, 'sqlunit')  or 
                                          @taskName = 'invoke'                                or 
                                          @taskName = 'clickLink'                              or 
                                          @taskName = 'clickButton'                          or 
                                          @taskName = 'clickElement'][@result = 'completed' or 
                                          @result   = 'failed']" />
	<table border="0">
		<tr>
			<th>Time</th>
			<th>Action</th>
			<th>Source Page</th>
			<th>Result Page</th>
			<th>Description</th>
		</tr>
		<xsl:for-each select="$requestSteps">
			<xsl:if test="number(@duration)&gt;1500">
				<tr>
					<xsl:attribute name="bgcolor">
						<xsl:choose>
							<xsl:when test="number(@duration)&gt;10000">
								<xsl:text>red</xsl:text>
							</xsl:when>
							<xsl:when test="number(@duration)&gt;5000">
								<xsl:text>pink</xsl:text>
							</xsl:when>
							<xsl:when test="number(@duration)&gt;3000">
								<xsl:text>orange</xsl:text>
							</xsl:when>
							<xsl:when test="number(@duration)&gt;1500">
								<xsl:text>yellow</xsl:text>
							</xsl:when>
							<xsl:otherwise>
								<xsl:text>white</xsl:text>
							</xsl:otherwise>
						</xsl:choose>
					</xsl:attribute>
					<xsl:variable name="previous_step" select="position()-1" />
					<td>
						<xsl:value-of select="@duration" />
					</td>
					<td>
						<xsl:value-of select="@taskName" />
						<xsl:choose>
							<xsl:when test="@taskName='clickButton'">
								<xsl:text>(</xsl:text>
								<xsl:value-of select="parameter[@name='label']/@value" />
								<xsl:text>)</xsl:text>
							</xsl:when>
							<xsl:when test="@taskName='clickLink'">
								<xsl:text>(</xsl:text>
								<xsl:value-of select="parameter[@name='label']/@value" />
								<xsl:text>)</xsl:text>
							</xsl:when>
							<xsl:when test="@taskName='invoke'">
								<xsl:text>(</xsl:text>
								<xsl:value-of select="parameter[@name='url']/@value" />
								<xsl:text>)</xsl:text>
							</xsl:when>
							<xsl:otherwise>
								<xsl:text>unknown</xsl:text>
							</xsl:otherwise>
						</xsl:choose>
					</td>
					<td>
						<a target="_blank">
							<xsl:attribute name="href">
								<xsl:if test="$responses.dir">
									<xsl:value-of select="$responses.dir" />
									<xsl:text>/</xsl:text>
								</xsl:if>
								<xsl:value-of select="$requestSteps[$previous_step]/resultFile/@name" />
							</xsl:attribute>
							<xsl:value-of select="$requestSteps[$previous_step]/resultFile/@name" />
						</a>
					</td>
					<td>
						<a target="_blank">
							<xsl:attribute name="href">
								<xsl:if test="$responses.dir">
									<xsl:value-of select="$responses.dir" />
									<xsl:text>/</xsl:text>
								</xsl:if>
								<xsl:value-of select="resultFile/@name" />
							</xsl:attribute>
							<xsl:value-of select="resultFile/@name" />
						</a>
					</td>
					<td>
						<xsl:if test="@description">
							<xsl:text> (</xsl:text>
							<xsl:value-of select="@description" />
							<xsl:text>)</xsl:text>
						</xsl:if>
						<xsl:text>...</xsl:text>
						<xsl:value-of select="@result" />
					</td>
				</tr>
			</xsl:if>
		</xsl:for-each>
	</table>
</xsl:template>

Týmto rozšírením sa opäť zvýši pridaná hodnota Canoo WebTestu. Zvýši sa o možnosť využiť ho aj ako nástroj na testy, ktorých výsledkom je analýza slabých miest aplikácií z pohľadu rýchlosti zobrazovania stránok/výkonu webovej aplikácie.

Príklady rozšírenia Canoo WebTest reportu o zoznam “pomalých stránok”:

Canoo Webtest: neštandardné testy využitím Javascriptu a Ruby + Bonus

 

 


Dobrý článok? Chceš dostávať ďalšie?

Už viac ako 6 200 ITečkárov dostáva správy e-mailom. Nemusíš sa báť, nie každé ráno. Len občasne.



Súhlasím so spracovaním mojich osobných údajov. ( Viac informácií. )

Tvoj email neposkytneme 3tím stranám. Posielame naňho len informácie z robime.it. Kedykoľvek sa môžeš odhlásiť.

Senior Sieťový Špecialista

PRÁCA Pozícia: Sieťový špecialista Pracovný pomer:  TPP Miesto práce: Bratislava, on-site Plat: od 1700+ EUR/Brutto/mesačneHlavné zodpovednosti:Navrhuje architektúru, štruktúru a IP adresácie multiplatformových LAN/MAN/WAN sietí ...

Data Mining Expert

PRÁCA Pozícia: Data Mining Expert Pracovný pomer:  TPP Miesto práce: Bratislava, on-site Plat: od 2000+ EUR/Brutto/mesačneAké výzvy ťa čakajú?Vynikajúca pracovná príležitosť pre nadšenca práca...

Artificial Intelligence Consultant

JOB Position: Artificial Intelligence Consultant Contract type: Full-Time Location: Bratislava Salary: 2000 EUR/Brutto/monthsResponsibilities:conceptual processing and development of the new solutions in the area e.g....

Artificial Intelligence Expert

JOB Position: Artificial Intelligence Expert Contract type: Full-Time Location: Bratislava Salary: 2000 EUR/Brutto/monthsSuccessful adaptation of technologies like machine learning, deep learning, artificial inteligence will determine companies...

Senior Front-end / Angular Developer / Tvorba serverovej a aplikačnej logiky

PRÁCA Pozícia: FE/ Angular developer Pracovný pomer:  TPP, živnosť Miesto práce: Bratislava, Prievidza, Žilina Plat: od 1700+ EUR/Brutto/mesačneNáplň práce:Spolupráca na vývoji SW...

Senior .NET/Angular developer

PRÁCA Pozícia: .NET/Angular developer Pracovný pomer:  TPP Miesto práce: Bratislava, on-site Plat: od 1700+ EUR/Brutto/mesačneČo bude Vašou náplňou práce:spolupodieľanie sa na vývoji SW riešenia...

Senior SAP XI/PI/PO Konzultant

Základné informáciePozícia: Senior SAP XI/PI/PO Konzultant Pracovný pomer:  TPP, Živnosť Miesto práce: 95% Homeoffice - 5% on-site - Bratislava/nemecko Plat: od 2500...

Srdečne ťa pozývame na stretnutie DDD Community – Analýza domény

Na začiatku nového roka sa zameriame na analytické uchopenie domény pomocou DDD....

TOP 10 skillov programátora

Chceš vedieť na akých 10 skillov by si sa ako programátor mal/a zamerať? Sú to skilly, ktoré ti pomôžu si nájsť prácu, či byť označovaný/á ako "guru".

SanDisk Connect Wireless Stick

Je USB kľúč, ktorý má vo svojom tele vo veľkosti necelých 8x2 cm zabudovanú batériu a wifi...

Čítaj ďalej:

Dobrý článok? Chceš dostávať ďalšie?

Už viac ako 6 200 ITečkárov dostáva správy e-mailom. Nemusíš sa báť, nie každé ráno. Len občasne.

Súhlasím so spracovaním mojich osobných údajov. ( Viac informácií. )

Tvoj email neposkytneme 3tím stranám. Posielame naňho len informácie z robime.it. Kedykoľvek sa môžeš odhlásiť.