2012-05-16 3 views
0

Я прочитал documentation о EUnit, но все же я понятия не имею, что является целью тестовых генераторов.Что такое генераторы тестов EUnit?

Я также прочитал хороший учебник here, но все равно не повезло (слишком продвинутый).

Я несколько понимаю, что функция тестового генератора возвращает набор тестов, которые затем выполняются EUnit. (Это верно?)

К сожалению, единственное, что я уверен, сейчас о том, что я могу написать тест, как это:

myfun_test() -> 
assertEqual(myresult,mymod:myfun()). 

Вопрос заключается в том: Какие испытания генераторов в EUnit необходимы и какова их связь с простым тестовым объектом?

P.S. Я знаю, что есть замечательный мир (example) модульных тестов, которые сделаны с помощью различных средств автоматизации и концепций, но я не знаю, как его ввести.

ответ

2

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

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

Например, следующие коды от gproc источника открытого проекта для тестового генератора, и он использует тестовый генератор для справки и файл может быть найден в github.

reg_test_() -> 
    {setup, 
    fun() -> 
      application:start(gproc), 
     application:start(mnesia) 
    end, 
    fun(_) -> 
      application:stop(gproc), 
     application:stop(mnesia) 
    end, 
    [ 
     {spawn, ?_test(?debugVal(t_simple_reg()))} 
     , ?_test(t_is_clean()) 
     , {spawn, ?_test(?debugVal(t_simple_counter()))} 
     , ?_test(t_is_clean()) 
     , {spawn, ?_test(?debugVal(t_simple_aggr_counter()))} 
     , ?_test(t_is_clean()) 
     , {spawn, ?_test(?debugVal(t_update_counters()))} 
     , ?_test(t_is_clean()) 
     , {spawn, ?_test(?debugVal(t_simple_prop()))} 
     , ?_test(t_is_clean()) 
     , {spawn, ?_test(?debugVal(t_await()))} 
     , ?_test(t_is_clean()) 
     , {spawn, ?_test(?debugVal(t_await_self()))} 
     , ?_test(t_is_clean()) 
     , {spawn, ?_test(?debugVal(t_await_crash()))} 
     , ?_test(t_is_clean()) 
     , {spawn, ?_test(?debugVal(t_simple_mreg()))} 
     , ?_test(t_is_clean()) 
     , {spawn, ?_test(?debugVal(t_gproc_crash()))} 
     , ?_test(t_is_clean()) 
     , {spawn, ?_test(?debugVal(t_cancel_wait_and_register()))} 
     , ?_test(t_is_clean()) 
     , {spawn, ?_test(?debugVal(t_give_away_to_pid()))} 
     , ?_test(t_is_clean()) 
     , {spawn, ?_test(?debugVal(t_give_away_to_self()))} 
     , ?_test(t_is_clean()) 
     , {spawn, ?_test(?debugVal(t_give_away_badarg()))} 
     , ?_test(t_is_clean()) 
     , {spawn, ?_test(?debugVal(t_give_away_to_unknown()))} 
     , ?_test(t_is_clean()) 
     , {spawn, ?_test(?debugVal(t_give_away_and_back()))} 
     , ?_test(t_is_clean()) 
     , {spawn, ?_test(?debugVal(t_select()))} 
     , ?_test(t_is_clean()) 
     , {spawn, ?_test(?debugVal(t_select_count()))} 
     , ?_test(t_is_clean()) 
     , {spawn, ?_test(?debugVal(t_qlc()))} 
     , ?_test(t_is_clean()) 
     , {spawn, ?_test(?debugVal(t_get_env()))} 
     , ?_test(t_is_clean()) 
     , {spawn, ?_test(?debugVal(t_get_set_env()))} 
     , ?_test(t_is_clean()) 
     , {spawn, ?_test(?debugVal(t_set_env()))} 
     , ?_test(t_is_clean()) 
     , {spawn, ?_test(?debugVal(t_get_env_inherit()))} 
     , ?_test(t_is_clean()) 
     , {spawn, ?_test(?debugVal(t_monitor()))} 
     , ?_test(t_is_clean()) 
     , {spawn, ?_test(?debugVal(t_monitor_give_away()))} 
     , ?_test(t_is_clean()) 
     , {spawn, ?_test(?debugVal(t_subscribe()))} 
     , ?_test(t_is_clean()) 
     , {spawn, ?_test(?debugVal(t_gproc_info()))} 
     , ?_test(t_is_clean()) 
    ]}. 
1

Чтения с самой страницы вы» ве связаны в вашем вопросе:

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

Функция с именем, заканчивающимся на ... тест() (обратите внимание на конечный подчеркивание) распознается EUnit как функция испытания генератора. Тесты генераторы возвращают представление набора тестов, которые должны быть выполнены EUnit.

Подумайте об испытаниях генераторов относительно возможности группировки тестов. Помимо более компактного кода, вы можете иметь расширенные функции для ваших тестов. Например, состояние для вашего набора тестов, функции инициализации и т. Д. И т. Д.

Если вам нужно, чтобы ваше приложение было всего лишь набором утверждений, ну, вероятно, вам не нужны тестовые наборы. Вы даже можете избежать использования EUnit в целом. Оператор соответствия шаблону (=) в Erlang - это блестящий оператор тестирования сам по себе.Сравните:

assertEqual(myresult,mymod:myfun()). 

с:

myresult = mymod:myfun() 
Смежные вопросы