2015-04-16 2 views
-1

У вас есть класс RunMe. Как следует из названия, он управляется другим классом. Давайте поступим через RunMe.run().Правильная конструкция для определенных методов

RunMe имеет личную переменную с данными, которые он использует для запуска различных тестов, позволяет звонить ist data. Предположим, что эти данные инициализированы RunMe.initialize().

После этого в методе run() первый тест запускается со значениями по умолчанию, установленными функцией initialize для data. Назовем этот тестовый метод testWithDefaultValues.

Теперь мы хотим заполнить наши data некоторыми пользовательскими данными. Предположим, мы делаем это, используя fillData.

Затем мы хотим выполнить другое испытание, используя наши недавно заполненные данные. Назовем этот тест testWithFilledData.

Наш вводного метод в этой точке будет выглядеть примерно так

public void run() { 
    initialize(); 
    testWithDefaultValues(); 
    fillData(); 
    testWithFilledData(); 
} 

Вы можете увидеть, как akward этот код выглядит? Он выглядит И чувствует себя не так. Вещь, которая сразу приходит мне в голову: единственная причина, по которой testWithFilledData(), а также testWithDefaultValues() фактически делает то, что предполагает это имя, вызвано порядком, в котором эти функции вызывают в run. Это должно быть неправильно.

Итак, вместо этого я должен устранить initialize и fillData и выполнить то, что эти функции выполняют в соответствующей тестовой функции?

Что делать, если вы считаете, что многие другие тестовые функции будут существовать, каждый из которых тестирует другой набор данных, все из которых должны быть заполнены вручную (data.setField("fooField","fooValue);).

Может ли кто-нибудь дать общую конструкцию или идею, в которой он объяснит, как он правильно разрешил данную задачу?

Прямо сейчас я действительно пытаюсь найти образец, который «чувствует себя хорошо» и правильно. То, что я делаю сейчас, должно быть ошибочным.

Редакция: Следует упомянуть, что тестовая функция не может быть общей. Для любых разных вариантов data необходимо учитывать различные результаты.

+1

Почему вы называете класс 'RunMe'? Что делают экземпляры класса? – immibis

+0

Класс на самом деле не называется RunMe, это был просто пример. Это часть селен-тест-сюиты. Предполагается, что в другом классе будет выполняться целый ряд тестов Selenium-Tests (для всех логических процедур, существующих на веб-сайте). Каждый класс (такой как RunMe в этом примере) иллюстрирует такой тест. Таким образом, класс не тестирует себя, класс IS является тестом. – Mercious

ответ

0

Хорошо, что произойдет, если вы попытаетесь позвонить testWithDefaultValues(), не позвонив по телефону initialize()? На самом деле вы не будете тестировать значения по умолчанию, вы будете тестировать все, что вы ранее устанавливали. Я думаю, вам следует отказаться от изменения внутренних тестовых данных в фактических тестовых функциях и, возможно, иметь общую тестовую функцию, которая имеет в ней data.

Это имеет смысл, если testWithDefaultValues() и testWithFilledData() на самом деле делают то же самое, но с разными данными.

Я думаю, что-то вроде этого имеет смысл:

Data testData = getTestData(); 
test(testData); 
Data fillData = getFillData(); 
test(fillData); 
+0

Да, это то, что я видел. Однако учтите, что вам нужно проверить набор данных, например, на 20 различных вариантов данных. Создаете ли вы 20 различных версий функций, которые содержат 20 разных наборов данных? Также test() не может быть общим. Я не упоминал об этом. Каждый тест должен учитывать разные результаты. Функция testWithDefaultValues ​​() должна учитывать другую, чем testWithFilledData(); – Mercious

+0

Даже если он не может быть общим, вы действительно не должны зависеть от внутреннего свойства данных, которое могут изменить другие методы тестирования. – Curtis

0

Я считаю, что вы должны заполнить только один метод со всем кодом, необходимым для тестирования вы пытаетесь достичь. Затем вы можете заполнить variables или data для вашего теста и выполнить различные значения для вашего data, чтобы запускать различные тесты, начиная всегда с того же метода.

С помощью этой простой конструкции вы можете создать несколько методов тестирования и не потеряться в своем коде.

EDIT

Вы всегда должны рассмотреть метод испытания вроде тестирования BlackBox. Если вы считаете, что не знаете, что такое код, запущенный внутри метода. Все, что вам нужно, это input и output из вас.

Если тот же метод должен производить разные output на основе разных input. Код внутри вашего черного ящика остается прежним.

Однако, если вашему методу необходимо взаимодействовать по-разному с input для генерации output, вам нужно, чтобы вам нужно было написать другой тест.

Мои два цента, надеюсь, что это помогает

+0

Это определенно было бы правильным способом сделать это, но, пожалуйста, рассмотрите мое Редактирование. Я не упомянул, что каждая тестовая функция должна будет проверять разные результаты, в зависимости от того, как заполняется информация. – Mercious

+0

отредактировал мой ответ – qcGold

0

Я предлагаю использовать шаблон проектирования метод шаблона, чтобы создать испытательную базу. Вероятно, вам будет лучше использовать зрелую тестовую среду, такую ​​как JUnit.

public abstract class TestCase { 
    // This is the template method. 
    public final boolean execute() { 
     initTest(); 
     return runTest(); 
    } 

    // Init hook method. 
    public abstract void initTest(); 

    // Test logic hook method. 
    public abstract boolean runTest(); 
} 

public abstract class BaseTest extends TestCase { 
    public boolean runTest() { 
     // This is the common execution for different data sets... 
    } 
} 

public Test1 extends BaseTest { 
    public void initTest() { 
     // Data init for test 1... 
    } 
} 

Вы можете продлить BaseTest для каждого испытываемого набора данных у вас есть. Для запуска тестов:

new Test1().execute(); 
new Test2().execute(); 

EDIT: Вы, конечно, можете пропустить BaseTest, если вы не имеете общий тест логики. Или вы можете адаптировать метод шаблона, чтобы добавить больше крючков для того, что имеет смысл для ваших конкретных потребностей. Главное - захватить общий процесс в методе шаблона, изолировать общий код в некоторых методах захвата и обеспечить уникальные перечеркивания бетона в других методах перехвата.

Смежные вопросы