Параметризация тестового использования CppUnit

вместо кнопки вы можете указать тег

<a href=\"action.php?id=$row[id]\">Delete</a>

и получить идентификатор, используя $ _REQUEST ['id']

<?php
$id =

вместо кнопки вы можете указать тег

[110]

и получить идентификатор, используя $ _REQUEST ['id']

[111]REQUEST['id']; // sending query $query = "DELETE * FROM sample_data WHERE id='".

вместо кнопки вы можете указать тег

[110]

и получить идентификатор, используя $ _REQUEST ['id']

[111]POST["id"]."'"; $statement = $connect ->prepare($query); if($statement->execute($data)) { echo 'data deleted'; } ?>
7
задан DavidRR 27 April 2015 в 15:09
поделиться

3 ответа

Не кажется возможным в CppUnit параметризовать тестовый сценарий непосредственно (см. здесь и здесь). Однако у Вас действительно есть несколько опций:

Используйте a RepeatedTest

Вы можете делать некоторое умное использование встроенного RepeatedTest декоратор. Это позволяет тестовому сценарию быть выполненным многократно (хотя без параметризации).

Я буду признаваться в том, что никогда не использовал это сам, но возможно Вы могли иметь RepeatedTest управляйте некоторой функцией привратника, которая была бы (использование статической переменной класса, возможно?) выбирают другой вход с каждым выполнением. Это в свою очередь вызвало бы истинную функцию, которую требуется протестировать с тем значением, как введено.

Используйте a TestCase подкласс

Один человек на странице SourceForge CppUnit утверждает, что записал подкласс TestCase это запустит конкретный тест произвольное количество раз, хотя немного отличающимся способом, чем RepeatedTest предложения класса. К сожалению, плакат просто описал мотивацию для создания класса, но не обеспечил исходный код. Было, однако, предложение связаться с человеком для получения дополнительной информации.

Используйте простую функцию помощника

Самое простое (но наименее автоматизированный) способ сделать это должно создать функцию помощника, которая берет параметр, который требуется передать "реальной" функции и затем иметь много отдельных тестовых сценариев. Каждый тестовый сценарий вызвал бы Вашу функцию помощника с различным значением.


Если бы Вы выбираете любую из первых двух упомянутых выше опций, я интересовался бы слушанием о Вашем опыте.

8
ответ дан 6 December 2019 в 21:21
поделиться

Я не программист на C++, но я могу помочь с понятием модульного теста:

Тестовые сценарии предназначены для выполнения изолированный и без зависимости от внешних параметров. Дополнительно необходимо подавить количество тестовых сценариев к минимуму, который покрывает большую часть кода. Существуют случаи, однако (и я уже имел дело с некоторыми), где некоторые тесты выглядят одинаково, отличаясь только некоторыми незначительными параметрами. Лучший выбор затем состоит в том, чтобы записать приспособление, которое берет параметр, Вы говорите об и затем имеете один тестовый сценарий для каждого из параметров, называя приспособление с ним. Универсальный пример следует:

class MyTestCase

  # this is your fixture
  def check_special_condition(param)
    some
    complex
    tests
  end

  # these are your test-cases
  def test_1
    check_special_condition("value_1")
  end

  def test_2
    check_special_condition("value_2")
  end

end

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

0
ответ дан 6 December 2019 в 21:21
поделиться
class members : public CppUnit::TestFixture
{
    int i;
    float f;
};

class some_values : public members
{
    void setUp()
    {
        // initialization here
    }
};

class different_values : public members
{
    void setUp()
    {
        // different initialization here
    }
};

tempalte<class F>
class my_test : public F
{
    CPPUNIT_TEST_SUITE(my_test<F>);
    CPPUNIT_TEST(foo);
    CPPUNIT_TEST_SUITE_END();

    foo() {}
};

CPPUNIT_TEST_SUITE_REGISTRATION(my_test<some_values>);
CPPUNIT_TEST_SUITE_REGISTRATION(my_test<different_values>);

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

3
ответ дан 6 December 2019 в 21:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: