wtorek, 2 września 2008

Komendy screen'a

Tym razem wpis nie związany z javą (chyba, że ktoś programuje w javie pod linuxem).

Lista komend screen'a:
(C oznacza ctrl)

  • C+a c - utworzenie okna
  • C+a C+a - ostatnio uzyte okno
  • C+a p - poprzednie okno
  • C+a n - nastepne okno
  • C+a [0-9] - okno o okreslonym numerze
  • C+a " - pelnoekranowa lista okien
  • C+a w - mała lista okien
  • C+a A - zmiana nazwy okna
  • C+a K - zabicie programu w bierzacym oknie
  • C+a d - odłączenie sesji screen'a (screen -r przylaczy ja spowrotem)
  • C+A :multiuser on - tryb wspoldzielenia sesji

Screen user manual
Screen wiki @ Gentoo

środa, 27 sierpnia 2008

Testowanie aplikacji JEE za pomocą Selenium i Maven

Selenium jest frameworkiem do testowania aplikacji webowych. Pozwala na szybkie i wygodne przygotowanie testów funkcjonalnych tego typu aplikacji. Uruchamia on przeglądarkę zainstalowaną w systemie i przy jej pomocy symuluje akcje użytkownika jakie jak wypełnienie formularza, kliknięcie przycisku czy łącza.

Ciekawostką jest że Selenium posiada plugin do firefoxa z dwiema funkcjonalnościami, którymi wyprzedza inne tego typu frameworki. Są to:

a) nagrywanie akcji wykonywanych przez przeglądarkę, które można zapisać, a następnie wielokrotnie odtwarzać

b) możliwość eksportu takich akcji do kilku popularnych języków programowania w tym i Javy.

Poniżej przedstawię konfiguracji podprojektu w Mavenie służącego do testów.

Struktura katalogów projektu jest następująca:

Katalog SeamMvn to główny katalog projektu, zawierający 4 katalogi podprojektów. Nas interesuje oczywiście podprojekt "tests". Główny katalog podprojektu zawiera wylacznie plik pom.xml. W katalogu src/test/resources umieszczono plik testing.xml służący do konfiguracji TestNG, natomiast w katalogu src/test/java znajdują sie zródła klas testujących. W moim projekcie jest tylko klasa SampleTest znajdująca sie w pakiecie pl.net.ert.todo.test.

Plik pom.xml wygląda następująco:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>pl.net.ert.seam</groupId>
<artifactId>SeamMvn-test</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<name>SeamMvn Maven Tests</name>
<url>http://maven.apache.org</url>
<parent>
<groupId>pl.net.ert.seam</groupId>
<artifactId>SeamMvn</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<repositories>
<repository>
<id>OpenQA</id>
<url>http://maven.openqa.org</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.openqa.selenium.client-drivers</groupId>
<artifactId>selenium-java-client-driver</artifactId>
<version>0.9.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>5.1</version>
<scope>test</scope>
<classifier>jdk15</classifier>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<executions>
<execution>
<phase>integration-test</phase>
<goals>
<goal>test</goal>
</goals>
</execution>
</executions>
<configuration>
<suiteXmlFiles>
<suiteXmlFile>src/test/resources/testing.xml</suiteXmlFile>
</suiteXmlFiles>
</configuration>
</plugin>
</plugins>
</build>
</project>


Plik testing.xml

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="seleniumTests">
<test name="functionalTests">
<packages>
<package name="pl.net.ert.todo.test"/>
</packages>
</test>
</suite>


SampleTest.java

package pl.net.ert.todo.test;

import com.thoughtworks.selenium.DefaultSelenium;
import com.thoughtworks.selenium.Selenium;
import org.testng.annotations.Test;

public class SampleTest {
Selenium browser;

public void openBrowser(){
browser = new DefaultSelenium("localhost", 4444, "*firefox", "http://localhost:8080/");
browser.start();
}

public void closeBrowser(){
browser.stop();
}
@Test
public void ok() {

}
}


Należy oczywiście wypełnić metodę ok i/lub dodać kolejne metody testujące.

Należy jeszcze skonfigurować serwer testów w tym celu ściągamy najnowszą wersję Selenium-RC oraz ostatnią wersję przeglądarki firefox 2 (wer. 3 nie testowałem). Po rozpakowaniu katalogu firefox z archiwum wypakujemy do niego plik selenium-server.jar z archiwum selenium-rc.

Wykonujemy następujące polecenia:

export PATH=$PATH:.
java -jar selenium-server.jar

W tym momencie mamy juz uruchomiony serwer testów i po uruchomieniu polecenia

mvn integration-test

w katalogu projektu powinnismy zobaczyc otwieranego i zamykanego firefoxa. To efekt działania naszej klasy testującej.

piątek, 22 sierpnia 2008

Szablon Seama gotowy

Tak więc ostatecznie udało się. Utworzyłem bazę do tworzenia przyszłych aplikacji w Seamie. Od poprzedniej wersji różni się tym, że obok linku Edit here dodałem przycisk EJB robiący dokładnie to samo. Od spodu jednak docelowy adres linku jest wpisany w pliku xhtml, natomiast dla przycisku wartość atrybutu action pochodzi z SLSB. Wszystko działa i nie sypie wyjątkami (nie licząc tego o braku komponentu msg ;) - o tym wiem).

Mając gotowy szablon można zabrać się za coś bardziej sensownego.

Link do pobrania.

Creative Commons License
Ten utwór jest dostępny na licencji Creative Commons Uznanie autorstwa 2.5 Polska.

JNDI w Glassfish

Próbując uruchomić Seama dosyć dużo czasu zajęło mi przebrnięcie przez jndi. Oto rezultaty:

Aby użyć Remote EJB jako beana w jsf musiałem zadeklarować go w następujący sposób:

@Remote()
public interface Hello {
public String edit();
}

@Name("helloworld")
@Stateless(mappedName = "hw")
@JndiName(value = "hw")
public class World implements Hello{
public String edit() {
return "/edit.xhtml";
}
}

Podsumowując:
  • interface musi być oznaczone @Remote
  • wartość mappedName mówi pod jaką nazwą EJB będzie udostępnione w JNDI
  • jest ona taka sama jak argument adnotacji @JndiName, gdyż ta druga mówi, pod jaką nazwą Seam ma szukać EJB.
Analogiczny opis postaram się przedstawić jak tylko dowiem się jak konfigurować lokalne EJB.

czwartek, 21 sierpnia 2008

JEE, Maven2 i... facelets

Dalszy rozwój mojej testowej aplikacji. Tym razem zawiera konfigurację i przykładowe strony w facelets. Po raz pierwszy użyłem atrybutu jsfc, rezygnując z wykorzystywania biblioteki jsf html. Hmm... Jeśli musimy współpracować z grafikiem to jest to naprawdę niezłe rozwiązanie. Jesli w edytorze mamy funkcję podglądu stron html to otrzymamy dokładnie to co później zwróci nam serwer (jeśli się używa mechanizmu szablonów to tylko część tego :) ).

Kod zawiera 2 strony jsf oraz jeden bean (aby sprawdzić czy działa). Aby to gdziekolwiek wykorzystać trzeba uzupełnić strony xhtml i dodać css, aby nie straszyło.

Link do archiwum.

Creative Commons License
Ten utwór jest dostępny na licencji Creative Commons Uznanie autorstwa 2.5 Polska.

środa, 20 sierpnia 2008

Szablon JEE z uzyciem Maven2

Na podstawie artykułu Jacka Laskowskiego stworzyłem zalążek aplikacji JEE przy pomocy Mavena. Jako, że jest to dopiero baza do przyszłego projektu to nie posiada ejb (ale jest przygotowane na nie miejsce) i składa się z eara zawierającego tylko pojedynczego wara. Skonfigurowany do deploy'a na glassfish. Docelowo planuje na jego podstawie stworzyć testową aplikacje korzystająca z jboss-seam.

A oto link.

Creative Commons License
Ten utwór jest dostępny na licencji Creative Commons Uznanie autorstwa 2.5 Polska.