Scala i Selenium miłe złego początki… cz. I

… a koniec średnio radosny.

Na początek będzie trochę o zestawianiu środowiska, czyli o rzeczach, które trzeba niestety zrobić i nie są one zbyt przyjemne dla naszej psychiki.

W moim przypadku mam za zadanie przygotować lekki i wygodny framework do testowania naszych aplikacji webowych. Ogólne założenia:

  • Pozwala na testowanie wszystkich (naszych) aplikacji.
  • Pozwala na pisanie testów z zachowaniem języka domeny.
  • Jest stosunkowo nieskomplikowany i łatwy w użyciu.

Ostatni punkt jest umowny o oznacza mniej więcej tyle, że API nie powinno mieć więcej niż kilka klas i odpowiadać mniej więcej elementom wizualnym w UI aplikacji oraz mapować akcje użytkownika na jakieś metody czy obiekty.

Kolejna rzecz to ten nieszczęsny „język domeny”, który w tym przypadku oznacza mniej więcej tyle co:
Dla obiektów:

  • Aplikacja dzieli się na ekrany.
  • Ekran jest formularzem albo listą.
  • Formularz zawiera pola.
  • Lista zawiera rekordy.

Dla akcji:

  • Do aplikacji można się zalogować i wylogować.
  • Ekran można otworzyć lub wysłać.
  • Pole można odczytać i można w nim pisać.
  • Listę można odczytać.

Czyli jest nieźle. Można sobie na tej podstawie wybudować jakieś ogólne wyobrażenie tego co będzie zawierać ta maszynka.

Czas na naszą narzędziownię. Będzie ona oparta o gotowe rozwiązania wspierające tworzenie testów aplikacji webowych. Zatem na pokładzie witamy:

  • Selenium – framework testów webowych.
  • Selenium IDE for FireFox – plugin do FF.
  • Firebug – kolejny plugin do FF ułatwia pracę z kodem HTML i ma m.n. obsługę xPath.
  • TestNG – silnik testów w javie, będzie nam to wszystko zbierał do kupy.
  • Scala – język w jakim to wszystko napiszemy.
  • Eclipse Indigo – nasze IDE.
  • Maven – budowanie, zarządzanie, wkurwianie to jego domena

Tu dochodzimy do głównej części dzisiejszego wpisu, czyli jak spiąć Eclipse ze Scalą (i Selenium). O ile integracja z Selenium polega w tym przypadku na podpięciu w pom.xml:

Listing 1. zależności od Selenium


	org.seleniumhq.selenium
	selenium
	LATEST
	pom

i cierpliwym poczekaniu, aż wszystko się ściągnie to ze Scalą jest kilka wrzodów.

Scala IDE

Bardzo fajne rozwiązanie dla programistów pracujących w Eclipse, którzy chcą używać Scali. Tyle tylko, że w wersji stabilnej z obsługą Scali 2.8.0 jest moim skromnym zdaniem kompletnie nieprzydatne. Wynika to z dwóch rzeczy. Po pierwsze sam kompilator Scali wymaga dość dużo RAMu i Eclipse musi mieć w opcjach wpisane co najmniej 1024m. Trzeba pogrzebać w eclipse.ini i poustawiać -Xmx oraz -Xms. Po drugie plugin wykorzystuje swój weavering, który ma tendencję deadlocków. Rozwiązaniem jest znowuż edycja ecclipse.ini:

Listing 2. workaround do deadlocków Scala IDE

 -XX:+UnlockDiagnosticVMOptions
 -XX:+UnsyncloadClass
 -Dosgi.classloader.lock=classname

tyle tylko, że jest to rozwiązanie klasy „będzie się cięło rzadziej, ale będzie”.
Rozwiązaniem pierwszego problemu jest za to wykorzystanie Scali 2.9.0RC2 i odpowiedniej wersji IDE, czyli bety 2.0.0. W celu oszczędzenia sobie ciężkiego urazu psychicznego polecam w tym przypadku instalację manualną przez rozpakowanie paczki z pluginem do dropins i olanie update site. W razie czego można się łatwo wrzodu pozbyć.

Na koniec konfiguracja pluginu scali do mavena, który pozwala na uniknięcie instalacji Scali w systemie (czasami przydatne):

Listing 3. Konfiguracja pom.xml



	org.scala-tools
	maven-scala-plugin
	LATEST
	
		
			
				compile
				testCompile
			
		
	
	
		${scala.version}
	



	org.scala-lang
	scala-library
	${scala.version}


	org.scalatest
	scalatest
	1.3

Tu mała uwaga na temat Eclipse. Pytanie jeżeli w projekcie definiujemy scala.version i mamy je też skonfigurowane w settings.xml, to które zostanie wykorzystane? Zdrowy rozsądek podpowiada, że to z pom.xml jak to ma miejsce w przypadku chociażby pluginów. No niestety zdrowy rozsądek należy odłożyć i dzięki temu odkrywamy, że zmienne w pom.xml są nadpisywane przez te z settings.xml.
Mam tu jeszcze Scala Test, czyli takiego DSLa do testów. Przyda się.

Napisz odpowiedź

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax