Статьи

Праздничные функциональные тесты для Swing GUI

Совсем недавно Алекс Руиз анонсировал релиз FEST-Swing 1.0 Alpha. Удачный момент, чтобы изучить, что это дает вам. В отличие от модульных тестов, которые фокусируются на определенных методах в приложении, функциональные тесты оценивают пользовательские сценарии. Например, вместо проверки того, работает ли метод «getUsers», функциональный тест проходит по небольшому, но всеобъемлющему сценарию, который, как ожидается, должен выполнить пользователь приложения. Например, в случае игры с анаграммой функциональный тест вводит некоторый текст в текстовое поле, нажимает кнопку, а затем сравнивает возвращаемое сообщение с сообщением, которое автор теста ожидает вернуть. Примерно так, в полупсевдокоде:

window.textBox ( «anagramField») enterText ( «абстракция»).
window.button ( «guessButton») нажмите кнопку ().
window.label («resultLabel»). requireText («Правильно! Попробуйте новое слово!»);

Круто то, что вышеприведенное вовсе не псевдокод. Это FEST-Swing (приспособления для простого тестирования программного обеспечения). Вот весь тестовый класс целиком:

import com.toy.anagrams.ui.Anagrams;
import org.junit.Test;
import org.fest.swing.fixture.FrameFixture;
import org.junit.After;
import org.junit.Before;

public class AnagramFestTest {

private FrameFixture window;

@Before
public void setUp() {
window = new FrameFixture(new Anagrams());
window.show();

}

@Test
public void shouldEnterAnagramAndReturnTrue() {
window.textBox("anagramField").enterText("abstraction");
window.button("guessButton").click();
window.label("resultLabel").requireText("Correct! Try a new word!");
}

@After
public void tearDown() {
window.cleanUp();
}

}

Это не плохо для теста. Когда вы запускаете вышеизложенное, приложение anagram запускается, и затем вы можете увидеть своими глазами, какой текст вводится в текстовое поле, нажимается кнопка и возвращается результат, после чего выдается вывод об успехе / неудаче. , с некоторой полезной информацией для отладки. И, как вы можете видеть, вы можете использовать его вместе с JUnit (или TestNG, если это то, что вы предпочитаете). Аргументы для вызовов «textBox», «button» и «label» являются именами рассматриваемых компонентов Swing. Так, в случае ниже JTextField, можно увидеть , что имя свойства установлено значение «anagramField» ниже, что является достаточным для инфраструктуры FEST , чтобы найти его в тесте выше:

Особенно, если сравнить его, например, с платформой NetBeans XTest , краткость FEST еще яснее. С фреймворком XTest смысл описанного выше теста будет примерно таким:

public void shouldEnterAnagramAndReturnTrue() {
JFrameOperator frmAnagrams = new JFrameOperator("Anagrams");
JLabelOperator lblGuess = new JLabelOperator(frmAnagrams, "Your Guess:");
JTextFieldOperator txtGuess = new JTextFieldOperator((JTextField)lblGuess.getLabelFor());
txtGuess.typeText("abstraction");
new JButtonOperator(frmAnagrams, "Guess").push();
JLabelOperator lblFeedback = new JLabelOperator(frmAnagrams, 2);
String expectedMessage = "Correct! Try a new word!";
assertEquals("Evaluation was wrong:", expectedMessage, lblFeedback.getText());
}

Этот код немного плотнее и многословнее. FEST извлекает выгоду из своего «свободного» подхода, который указывает (как указано в блоге одного из основателей свободно говорящего Мартина Фаулера ) на его попытку «быть читабельным и плавным». Вы можете буквально собрать быстрый тест FEST вместе, не задумываясь, если вы знаете сценарий, с которым вы хотите иметь дело, и названия участвующих компонентов Swing. Не нужно много документации, если вы играете с функцией автозаполнения IDE.

Что еще очень круто, так это то, что Алекс Руиз из FEST представит на JavaOne в этом году, как объясняет его запись в блоге , вместе с интересным описанием того, чего можно ожидать.

Вот некоторые ресурсы, если вы новичок в FEST и хотите взять его на себя:

Наконец, FEST — это не только тестирование Swing GUI. Взгляните, например, на эту статью о FEST-Reflection .