- •1. Принципы организации тестового кода с использованием каркаса nUnitForms
- •2. Принципы организации тестового кода с использованием каркаса fest.
- •3. Понятие регрессионного тестирования
- •4. Интеграционное тестирование. Уровни, стратегии, их достоинства и недостатки
- •5. Принципы использования каркаса fitness
- •6. Основные принципы стратегии «Чистой комнаты»
- •7. Основные принципы подхода непрерывной интеграции
- •8. Этапы цикла построения по на примере Hudson
8. Этапы цикла построения по на примере Hudson
Hudson – это как бы сервер CI (Continuous Integration). Hudson доступен в виде пакета, поэтому его установка довольно проста. Кроме того, всю свою конфигурацию Hudson хранит в файлах, в виду чего не требует интеграции с какой-либо БД. Архитектура Hudson построена на основе плагинов. То есть по сути работа Hudson сводится к хранению настроек проектов/плагинов и сборке проекта. В свою очередь сборка проекта заключается в запуске в определённом порядке установленных плагинов, включённых в настройках проекта. Плагины можно разделить на несколько условных групп, образующих цикл сборки проекта именуемый также как «pipeline»: 1) Управление исходным кодом (получение/обновление кода проекта из репозитория), 2) Триггеры сборки (настройка времени автозапуска для сборки проекта), 3) Среда сборки (настройка среды сборки проекта), 4) Сборка (основной этап: запуск плагинов, осуществляющих логику сборки, интеграции и тестирования), 5) Послесборочные операции (формирование/публикация отчётов, нотификация). К сожалению, Hudson позволяет изменять только порядок выполнения плагинов, входящих в группу «сборка» (порядок выполнения остальных плагинов в рамках своей группы определяется на основе значений аннотации @Execution коде плагинов). Поэтому, необходимо реализовать свой сценарий сборки, для которого не достаточно набора стандартных плагинов из группы «Сборка», можно пойти тремя путями: 1) Вызвать любой внешний исполняемый скрипт, реализующий этот сценарий (пункт ”Execute Shell” из меню ”Add build step”), 2) Подключить плагин системы сборки проекта (Phing, Ant, Maven) и указать необходимую цель, 3) Написать свой плагин. Этапы цикла построения ПО: 1) Создание репозитория, 2) Установка Ant (К примеру, однако есть и другие инструменты, которыми можно автоматизировать процесс сборки ПО (Phing, Maven)), 3) Создание Ant скрипта (Скрипт пишется в формате Xml, позволяет задать установки для сборки), 4) Создание новых задач (Создание новых проектов/задач, указывая его имя и настройки для соответствующих плагинов: URL в репозитории SVN и команду для сборки), 5) Создание рабочей копии, 6) Создание кода, 7) Коммит.
Пример организации теста с помощью FEST
package fest;
import org.fest.swing.annotation.GUITest;
import org.fest.swing.fixture.FrameFixture;
import org.fest.swing.junit.v4_5.runner.GUITestRunner;
import org.junit.*;
import static org.junit.Assert.*;
import org.junit.runner.RunWith;
@RunWith(GUITestRunner.class)
public class MainFormTest {
private FrameFixture frameFixture;
@Before
public void setUp() {
frameFixture = new FrameFixture(new MainForm("Main form"));
frameFixture.show();
}
@After
public void tearDown() {
frameFixture.cleanUp();
}
@GUITest
@Test
public void mainFormTest(){
frameFixture.radioButton("RB1").click();
assertEquals(frameFixture.list("List").contents().length, 1);
frameFixture.radioButton("RB2").click();
assertEquals(frameFixture.list("List").contents().length, 2);
frameFixture.radioButton("RB3").click();
assertEquals(frameFixture.list("List").contents().length, 3);
frameFixture.radioButton("RB4").click();
assertEquals(frameFixture.list("List").contents().length, 4);
frameFixture.radioButton("RB5").click();
assertEquals(frameFixture.list("List").contents().length, 5);
frameFixture.checkBox("CB").click();
frameFixture.textBox("TB").requireText("Текст");
frameFixture.checkBox("CB").click();
frameFixture.textBox("TB").requireText("");
frameFixture.radioButton("RB4").click();
assertEquals(frameFixture.list("List").contents().length, 4);
frameFixture.radioButton("RB3").click();
assertEquals(frameFixture.list("List").contents().length, 3);
frameFixture.radioButton("RB2").click();
assertEquals(frameFixture.list("List").contents().length, 2);
frameFixture.radioButton("RB1").click();
assertEquals(frameFixture.list("List").contents().length, 1);
}
}
Пример организации теста с помощью NUnitForms
using System;
using System.Collections.Generic;
using System.Text;
using NUnit.Framework;
using NUnit.Extensions.Forms;
namespace ForUITest
{
[TestFixture]
class TestClass
{
[Test]
public void TestButton()
{
Form1 form = new Form1();
form.Show();
ButtonTester buttonTest = new ButtonTester("button1");
buttonTest.Click();
TextBoxTester tbt = new TextBoxTester("textBox1");
Assert.AreEqual(tbt["Text"], "pressButton");
form.Close();
}
[Test]
public void TestRadioOne()
{
Form1 form = new Form1();
form.Show();
RadioButtonTester rbt = new RadioButtonTester("radioButton1");
rbt.Click();
TextBoxTester tbt = new TextBoxTester("textBox1");
Assert.AreEqual(tbt["Text"], "pressRadioButtonOne");
form.Close();
}
[Test]
public void TestRadioTwo()
{
Form1 form = new Form1();
form.Show();
RadioButtonTester rbt = new RadioButtonTester("radioButton2");
rbt.Click();
TextBoxTester tbt = new TextBoxTester("textBox1");
Assert.AreEqual(tbt["Text"], "pressRadioButtonTwo");
form.Close();
}
[Test]
public void TestCheckBox()
{
Form1 form = new Form1();
form.Show();
CheckBoxTester cbt = new CheckBoxTester("checkBox1");
cbt.Click();
TextBoxTester tbt = new TextBoxTester("textBox1");
Assert.AreEqual(tbt["Text"], "pressCheckBox");
form.Close();
}
}
}
