2013-11-14 2 views
3

Как вы можете протестировать ваш PL/PgSQL? Какие библиотеки/инструменты вы используете?Какие инструменты/библиотеки вы используете для тестирования вашего PL/PgSQL

Какой процент вашего кода покрывается модульными тестами и как вы его измеряете? Как вы решаете, какие модули для тестирования модуля сначала?

Считаете ли вы, что время и усилия, которые вы вложили в модульное тестирование, окупились или нет?

Если вы не используете модульное тестирование, можете ли вы объяснить, почему нет?

+0

Хотя тема интересна, то этот вопрос, как вы попросили его бедный подходят для этого сайта, так как он зовёт расширенное обсуждение из нескольких точек, а не автономные ответы на конкретный вопрос или проблему. Ознакомьтесь с этими статьями справки: http://stackoverflow.com/help/on-topic http://stackoverflow.com/help/dont-ask – IMSoP

ответ

5

Если у меня есть функция public.foo(bar text) returns text ...

создать другую функцию, как это:

create or replace function test.foo() returns void as $$ 
begin 

    perform assert_equals('stuff', public.foo('thing')); 
    perform assert_null(public.foo(null)); 
    ... 

end $$ language plpgsql; 

У меня есть некоторые функции, такие как утверждают следующее. Я намеренно использую те же имена и подписи, что и JUnit.

CREATE OR REPLACE FUNCTION assert_equals(expected text, actual text) RETURNS void AS $$ 
begin 
     if expected = actual or (expected is null and actual is null) then 
      --do nothing 
     else 
      raise exception 'Assertion Error. Expected <%> but was <%>', expected, actual; 
     end if; 

end $$ LANGUAGE plpgsql; 

У меня также есть функции для выполнения всех тестов:

CREATE OR REPLACE FUNCTION test.run_all() RETURNS void AS $$ 
declare 
    skip constant name[] = '{run_all}'; 
    test_schema_name constant name = 'test'; 
    proc pg_catalog.pg_proc%rowtype; 
    started timestamptz; 
begin 

    raise notice 'Time(m) Name'; 
    for proc in select p.* from pg_catalog.pg_proc p join pg_catalog.pg_namespace n on pronamespace = n.oid where nspname = test_schema_name and not proname = any(skip) order by proname loop 
     started = clock_timestamp(); 
     execute format('select %s.%s();', test_schema_name, proc.proname); 
     raise notice '% %.%()', to_char(clock_timestamp() - started, 'MI:SS:MS'), test_schema_name, proc.proname; 
    end loop; 

end $$ LANGUAGE plpgsql; 

Что касается вашего вопроса:

Какой процент кода покрыта юнит-тестов, и как вы меру Это?

Не уверен. Думаю, мне нужен инструмент для покрытия кода.

UPDATE: Похоже, что вы можете проверить покрытие кода с https://github.com/kputnam/piggly

Как вы решаете, какие модули для модульного тестирования в первую очередь?

самые complex единицы.

Считаете ли вы, что время и усилия, которые вы вложили в свое подразделение испытательный жгут, окупились или нет?

Определенно рад, что я использую модульное тестирование.

Также смотрите в:

http://pgtap.org/
http://en.dklab.ru/lib/dklab_pgunit/
http://www.epictest.org/

+1

+1 Это очень интересно! –

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