wiki:GUI-testaus
Last modified 3 years ago Last modified on 2014-02-08 21:06:47

Graafisten käyttöliittymien automaattinen testaus Java/Swing-ympäristössä

Tässä annetaan ohjeet käyttöliittymän testaamiseen hieman muunnellun LIFT-kirjaston avulla, jotta testit pystytään kirjoittamaan comtestin avulla. LIFT on Javan graafisten käyttöliittymien automaattista testaamista helpottava kirjasto.

Asentaminen

Käyttö

  • Luo comtest-testi samoin kun testaisit normaalia aliohjelmaa
  • Käyttöliittymän testaus vaatii kuitenkin muutaman lisäasetuksen:
    • Tuo swing-kirjasto: #import javax.swing.*;
    • Luo testaava luokka: comtest.GUITester g = new comtest.GUITester();
    • Luo käyttöliittymäluokka: Luokka muuttuja = new Luokka();
    • Aseta se näkyviin: muuttuja.setVisible(true);
	 * #import javax.swing.*;
	 *   comtest.GUITester g = new comtest.GUITester();
	 *   HuoneGUI frame = new HuoneGUI();
	 *   frame.setVisible(true);
  • jotta komponentti löytyy, on sille annettava nimi tyyliin:
    textLeveys.setName("textLeveys");
    
    tämän voi asettaa myös WindowBuilderillä kun avaa komponentin lisäominaisuudet, jolloin name löytyy.
  • nappuloiden yms. testaaminen tapahtuu erilaisilla metodeilla. Periaatteena on, että ensiksi etsitään käpelöitävä komponentti, ja sitten annetaan se parametrinä testaavalle luokalle.
	 *   JTextField textLeveys = g.getComponent(JTextField.class, "textLeveys");
	 *   g.click(textLeveys,10,10);
	 *   g.keyString(textLeveys,"\n3.2");
	 *   haeLuku(textLeveys,0.0) ~~~ 3.2; 
	 *   g.keyString(textLeveys,"\nkissa");
	 *   haeLuku(textLeveys,0.0) ~~~ 0.0;
  • LIFTin käyttämät metodit: http://courses.cs.vt.edu/~cs1114/api/student/GUITestCase.html
  • Lisätietoa itse Liftistä
  • lift.jar:in ehtoihin on lisätty myös textMatches jossa ehto reg.expinä (alkuperäisessä vain textIs)
  • samoin lisätty nameMatches
  • Esimerkkikoodi kokonaisuudessaan löytyy: HuoneGUI.java
  • Jos käyttäliittymästä aukeaa vaikka JOptionPane-dialogi, voidaan sitä testata mallin: SwingAanestys.java mukaisesti (ks aanesta-metodin testit).
  • Jos MessageDialogiin on laitettu rivinvaihtoja ei Labelin getText()-metodi jostakin syystä anna kuin 1. rivin. Silloin sisältö voidaan hakea seuraavasti:
    String s = (String)(g.getComponent(JOptionPane.class).getMessage());  
    
  • jos Regular Expressionissa halutaan jokerin .* kattavan myös rivinvaihtoja, pitää tämä ilmoittaa ?s -optiolla:
    s =R= "(?s).*Poika: 2.*"; 
    

lift.jar kääntäminen

Tämä ohje on vain niille, jotka haluavat kehittää kirjastoa.

student-library

  • ota joko (tee projekti nimeltä student-library)

https://svn.cc.jyu.fi/srv/svn/ohj2/studentlibrary

  • tai
    • lataa ja pura web-cat
    • tee student-library -tiedostosta Eclipse projekti
    • vaihda build.properties tiedostossa
      abbot.download.url=http://prdownloads.sf.net/abbot/abbot-1.2.0.zip?download
      xstream.download.url = http://repo1.maven.org/maven2/com/thoughtworks/xstream/xstream-distribution/1.3.1/xstream-distribution-1.3.1-bin.zip
      
    • tarkista muutenkin mitkä ovat uusimmat versiot (mutta abbot 1.3 ei toiminut).
    • lisää GUIFilter.javaan:n metodit
          // ----------------------------------------------------------
          private static GUIFilter textMatches(final String text)
          {
              GUIFilter gf = new GUIFilter("text = \"" + text + "\"")
              {
                  public boolean test(Component component)
                  {
                      Method m = null;
                      try
                      {
                          m = component.getClass().getMethod("getText");
                          String s = ((String)m.invoke(component));
                          if ( s == null ) return false;
                          return s.matches(text);
                      }
                      catch (Exception e)
                      {
                          return false;
                      }
                  }
              };
              return gf;
          }
      
          // ----------------------------------------------------------
          private static GUIFilter nameMatches(final String name)
          {
              GUIFilter gf = new GUIFilter("name = \"" + name + "\"")
              {
                  public boolean test(Component component)
                  {
                      if (component.getName() == null)
                      {
                          return name == null;
                      }
                      else
                      {
                          return component.getName().matches(name);
                      }
                  }
              };
              return gf;
          }
      
          public static abstract class Operator
          ...
              // ----------------------------------------------------------
              /**
               * Create a filter that compares the name of a component against a
               * given value.
               * @param name  The name to look for (as regexp)
               * @return A new filter that succeeds only on components with the
               *         given name
               */
              public GUIFilter nameMatches(final String name)
              {
                  return applySelfTo(GUIFilter.nameMatches(name));
              }
      
      
      
              // ----------------------------------------------------------
              /**
               * Create a filter that checks the text of a component by calling the
               * component's <code>getText()</code> method.
               * @param text The text (reg.exp) to look for
               * @return A new filter that succeeds only on components where
               *         <code>getText()</code> returns the specified text.
               */
              public GUIFilter textMatches(final String text)
              {
                  return applySelfTo(GUIFilter.textMatches(text));
              }
      
      
      
      
    • aja build.xml
      • jos valittaa JAVA_HOME:sta niin vaihda Window|Preferences|Java|Installed JREs vastaavaan JDK-hakemistoon

lift