Есть ли в JUnit 4 эквивалент @BeforeSuite testNG? - PullRequest
6 голосов
/ 08 декабря 2011

Я новичок в области автоматизации тестирования, так что простите меня, если это глупый вопрос, но на этот раз Google подвел меня. Или, по крайней мере, все, что я прочитал, только смутило меня.

Я использую JUnit 4 и Selenium Webdriver в Eclipse. У меня есть несколько тестов, которые мне нужно выполнить как набор, а также индивидуально. На данный момент эти тесты работают нормально, когда запускаются самостоятельно. В начале теста тестировщику / пользователю представляется поле ввода, спрашивающее сначала, на каком сервере они хотят тестировать (это строковая переменная, которая становится частью URL) и с каким браузером они хотят протестировать. В момент запуска тестов в наборе пользователю задается вопрос об этом в начале каждого теста, поскольку, очевидно, это закодировано в каждом из их методов @Before.

Как мне взять эти значения один раз и передать их каждому из методов тестирования?

Так что, если server = "server1" и browser = "firefox", то firefox - это браузер, который я хочу использовать селеном, и URL, который я хочу открыть, - http://server1.blah.com/ для всех следующих методов тестирования. Причина, по которой я использовал отдельные методы @Before, заключается в том, что требуемый URL-адрес немного отличается для каждого метода тестирования. каждый метод тестирует отдельную страницу, такую ​​как server1.blah.com/something и server1.blah.com/somethingElse

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

Я также мог бы преобразовать свои тесты в testNG, если есть более простой способ сделать это в testNG. Я думал, что аннотация @BeforeSuite может сработать, но теперь я не уверен.

Любые предложения и критика (конструктивные) очень ценятся

Ответы [ 4 ]

1 голос
/ 08 декабря 2011

Вы можете адаптировать решение для установки глобальной переменной для набора в этом ответе на JUnit 4 Тестовый вызов .

По сути, вы расширяете Suite для создания MySuite.Это создает статическую переменную / метод, который доступен из ваших тестов.Затем в своих тестах вы проверяете значение этой переменной.Если он установлен, вы используете значение.Если нет, то вы получите это.Это позволяет вам запустить один тест и набор тестов, но вы спросите пользователя только один раз.

Итак, ваш набор будет выглядеть так:

public class MySuite extends Suite {
    public static String url;

    /**
     * Called reflectively on classes annotated with <code>@RunWith(Suite.class)</code>
     * 
     * @param klass the root class
     * @param builder builds runners for classes in the suite
     * @throws InitializationError
     */
    public MySuite(Class<?> klass, RunnerBuilder builder) throws InitializationError {
        this(builder, klass, getAnnotatedClasses(klass));
        // put your global setup here
        MySuite.url = getUrlFromUser();
    }
}

Это будетиспользуется в вашем наборе примерно так:

@RunWith(MySuite.class)
@SuiteClasses({FooTest.class, BarTest.class, BazTest.class});

Затем в ваших тестовых классах вы можете сделать что-то в @Before/@After, или лучше взглянуть на TestRule , или, если хотитеПоведение до и после, посмотрите на ExternalResource .ExternalResource выглядит следующим образом:

public static class FooTest {
    private String url;

    @Rule
    public ExternalResource resource= new ExternalResource() {
        @Override
        protected void before() throws Throwable {
            url = (MySuite.url != null) ? MySuite.url : getUrlFromUser();
        };

        @Override
        protected void after() {
            // if necessary
        };
    };

    @Test
    public void testFoo() {
        // something which uses resource.url
    }
}

Конечно, вы можете экспортировать класс ExternalResource и использовать его из нескольких тестовых случаев.

1 голос
/ 09 декабря 2011

Я думаю, что основная функциональность TestNG, которая будет здесь полезна, - это не только @BeforeSuite, но и @DataProviders, которые упрощают выполнение одного и того же теста с другим набором значений (и не требуют использования статики,который всегда становится проблемой в будущем).

Возможно, вас также заинтересует поддержка скриптов в TestNG, которая упрощает запрос пользователя на ввод данных перед началом тестирования, - это примерчто вы можете сделать с BeanShell .

0 голосов
/ 09 сентября 2016

Если вы используете @RunWith(Suite.class), вы можете добавить статические методы с помощью @BeforeClass@AfterClass), которые будут выполняться до (и после) всего набора, который вы определяете.См. этот вопрос .

Это, конечно, не поможет, если вы имеете в виду весь набор классов, найденных динамически, и не используете Suite runner .

0 голосов
/ 08 декабря 2011

Возможно, имеет смысл сгруппировать тесты, чтобы набор тестов имел одинаковый код метода @Before, чтобы у вас был набор тестов для каждого отдельного.

Другой вариант может заключаться в том, чтобы использовать один и тот же базовый URL для каждого теста, но перейти на конкретную страницу, заставив селен переходить туда, где вы хотите провести тест.

...