Простые правила написания функциональных автотестов.
2008-05-06 23:00:25 (читать в оригинале)
1) Имя метода автотеста должно ясно описывать, что этот тест делает. Например:
testLogin будет более информативным именем для автотеста, чем test1_1.
Какие плюсы могут быть от такого именования автотестов?
- Вам будет проще ориентироваться в тестах.
- Другим будет проще их использовать и поддерживать.
2) Лишняя логика в методе автотеста будет только усложнять его. Посмотрим на следующий тест :
public testPostMessage() {
selenium.type("id=title", "Hello world");
selenium.type("id=text", "and everybody!!!");
for (int i = 0; i < 3; i++) {
selenium.type("id=tags" + i, "test post" + i);
}
selenium.select("id=access", "label=all");
selenium.click("id=submit");
}
Даже с простыми idшками не сразу можно понять что происходит в автотесте. Немного упростим его:
private void setMessageTitle(String title) {
selenium.type("id=title", title);
}
private void setMessageText(String text) {
selenium.type("id=text", text);
}
private void setMessageTags(String tag){
for (int i = 0; i < 3; i++) {
selenium.type("id=tags" + i, tag + i);
}
}
private void setMessageAccess(String access){
selenium.select("id=access", "label=" + access);
}
private void submit(){
selenium.click("id=submit");
}
public testPostMessage() {
setMessageTitle("Hello world");
setMessageText("and everybody!!!");
setMessageTags("test post")
setMessageAccess("all")
submit();
}
Код автотеста увеличился в размере, но при этом сам автотест стал более понятным.
3) Метод автотеста должен быть коротким настолько, насколько это возможно. Основной плюс опять же в простоте понимания такого теста. Например, есть два автотеста:
public void testLogin() {
goToLoginForm();
enterLogin();
enterPass();
clickLogin();
assertTrue(isLoggedIn());
}
и
private void login() {
goToLoginForm();
enterLogin();
enterPass();
clickLogin();
}
public void testLogin() {
login();
assertTrue(isLoggedIn());
}
Второй автотест выглядит более понятным, несмотря на простоту примеров. С ростом размеров автотеста, количества автотестов, разница между первым и вторым вариантами написания автотеста будет ощущаться все больше и больше.
4) С помощью констант можно сделать код автотестов более понятными. Есть следующий тест:
public void testPassword() {
assertTrue(login.isPasswordValid("qwerty"));
assertFalse(login.isPasswordValid("asdf"));
}
Добавим в этот автотест несколько констант, и код станет более понятным :
String validPassword = "qwerty";
String inValidPassword = "asdf";
public void testPassword() {
assertTrue(login.isPasswordValid(validPassword));
assertFalse(login.isPasswordValid(inValidPassword));
}
Собираем все ссылки со страницы используя selenium rc.
2008-05-02 11:52:06 (читать в оригинале)
Довольно часто, автотестами приходиться проверять ссылки. С помощью автотеста selenium rc это можно сделать несколькими способами. Например воспользовавшись встроенной функцией selenium rc getAllLinks().
Используя в автотесте selenium.getAllLinks() на выходе получим массив строк, содержащий idшки всех ссылок на странице. Это правда не всегда удобно. Во-первых потому, что чаще в автотесте бывает нужен текст ссылки, а не ее id. Во-вторых потому, что idшки у ссылки может и не быть и тогда соответствующий ей элемент массива будет пустой строкой :(
В таких случаях можно поступить следующим образом :
count = sel.getText("dom=document.getElementsByTagName('a').length");
String[] links = new String[count];
for (int i = 0; i < count; i++) {
links[i] = sel.getText("dom=document.getElementsByTagName('a')[" + i + "]");
}
Простейший функциональный автотест на selenium rc.
2008-04-27 19:10:06 (читать в оригинале)
Что потребуется для написания и запуска автотеста :
- скачиваем последнюю версию selenium rc
- скачиваем последнюю версию junit
теперь приступаем к написанию автотеста. Импортируем в код автотеста следующие классы:
import junit.framework.TestCase;
import com.thoughtworks.selenium.DefaultSelenium;
junit.framework.TestCase является базовым классом для всех автотестов использующих junit. Создаем класс нашего теста и наследуемся от него:
public class SimpleTest extends TestCase {
Создаем объект selenium rc: DefaultSelenium с помощью которого в дальнейшем будем совершать все действия в браузере:
DefaultSelenium sel = new DefaultSelenium("127.0.0.1", 4444, "*chrome", "http://www.mail.ru");
Далее создаем наш тестовый метод, который и будет автотестом. Это должен быть метод:
- public
- не static
- без параметров
- имя метода должно начинаться с test.
public void testSimple1() throws Exception {
Сценарий для нашего автотеста будет следующий:
- Мы открываем главную страницу портала mail.ru.
- Переходим к поиску по картинкам.
- Ищем по запросу 'Фото'.
- Проверяем, что в результатах поиска что то есть.
Довольно тривиальный сценарий автотеста, но для примера вполне подойдет :). Переходим к написанию кода самого автотеста.
sel.start();
sel.open("http://www.mail.ru");
sel.click("link=Картинки");
sel.waitForPageToLoad("60000");
sel.type("id=q", "Фото");
sel.click("xpath=//input[@value=' Найти ']");
sel.waitForPageToLoad("60000");
assertTrue("Нет результатов поиска", sel.isElementPresent("id=result_wrapper"));
sel.stop();
}
Чтобы запустить автотест, сохраняем этот код в файле SimpleTest.java и компилируем его:
javac -cp junit-4.4.jar;selenium-java-client-driver.jar SimpleTest.java
Если библиотеки junit-4.4.jar и selenium-java-client-driver.jar находятся в одной папке с исходником теста, то проблем быть не должно. Далее нужно запустить сервер селениума:
java -jar selenium-server.jar -multiwindow
И в новом окошке консоли запускаем сам автотест:
java -cp .;junit-4.4.jar;selenium-java-client-driver.jar junit.textui.TestRunner SimpleTest
Если все прошло хорошо, то после выполнения автотеста увидеть вы должны что-то подобное:
> java -cp .;junit-4.4.jar;selenium-java-client-driver.jar junit.textui.TestRunner SimpleTest
.
Time 19,422
OK (1 test)
Страницы:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15