Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: TDD (TestDrivenDevelopment)/ make CASED test  (Прочитано 22283 раз)
0 Пользователей и 1 Гость смотрят эту тему.
comm
Гость
« : 23-12-2003 20:46 » 

народ! кто пишет тесты?

а то вот вопрос проявился:

как, у вас, решается проблема тестирования модуля (подсистемы)
имеющую набор входных параметров (до 10) и набор выходных
то есть тест вида:
------
void test1() {
 arg1 = val1;
 arg2 = val2;

 myfunc();

 TS_ASSERT( retValue1 == const1 );
 TS_ASSERT( retValue2 == const2 );
}
------

при этом для разных случаев работы наборы буду соотв. разные.
и всех нужно проверить

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

один из вариантов вижу в скрипте для перла, то это жестко будет, тк в Си-коде будет встроеный док. с совершенно другим синтаксисом

а какие есть другие варианты?
Записан
ysv_
Помогающий

ua
Offline Offline

« Ответ #1 : 26-12-2003 18:09 » 

Я чего то не понимаю. Каким образом функция получает входные и возвращает выходные? Из вопроса это не ясно. В зависимости от способа и ответ будет. Особенно инетересно, каким образом возвращается результат.
В принципе идея насчет таблицы ИМХО правильная. А в общем идея, чтобы не писать каждый раз обработчик таблицы - сделать его таким, что он будет получать адрес функции-wrapper'а вокруг твоей функции, которая собственно и будет запускать ее (твою функцию) для заданного набора из таблицы.
Все это возможно если таблицы разнятся только количеством элементов, а не их типом.
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #2 : 26-12-2003 19:37 » 

Абсолютно непонятен вопрос и где параметры - поподробнее....
Записан

А птичку нашу прошу не обижать!!!
comm
Гость
« Ответ #3 : 26-12-2003 20:15 » 

Цитата: ysv_
Я чего то не понимаю. Каким образом функция получает входные и возвращает выходные? Из вопроса это не ясно. В зависимости от способа и ответ будет. Особенно инетересно, каким образом возвращается результат.


имхо, в тексте примера указаны переменные arg1, arg2, retValue1, retValue1 через которые myfunc() принимает входные параметры и возвращает результат. в данном примере переменные глобальные

Цитата: ysv_
В принципе идея насчет таблицы ИМХО правильная. А в общем идея, чтобы не писать каждый раз обработчик таблицы - сделать его таким, что он будет получать адрес функции-wrapper'а вокруг твоей функции, которая собственно и будет запускать ее (твою функцию) для заданного набора из таблицы.

а можно поподробнее о врапере ?

Цитата: ysv_

Все это возможно если таблицы разнятся только количеством элементов, а не их типом.


все было бы хорошо, но ведь  в таблицу кроме задаваемых значений сводятся и ожидаемые результаты
int arg1, int arg2, int ret;
0, 0,   0 ;  //0+0=0
1, 0,   1 ;  //1+0=1
1, 1,   2 ;  //1+1=2

при этом если типы еще как-то можно привести к 4 байтам, то  количество входов и выходов везде разнится


сейчас я реализовал это через скрипт для перла, но в дебагере весьма криво это смотрится Жаль(

void test1()
{
 int _a, _b, _ret;
 CTEST_CASE( _ret = sum(_a, _b) ) {
   int _a, int _b, int _ret;
   0, 0,   0 ;  //0+0=0
   1, 0,   1 ;  //1+0=1
   1, 1,   2 ;  //1+1=2
 }
}

это пример, этот код и линейно неплохо бы смотрелся, но когда подсистема принимает аргументы, и много, через глобальное пространство имен, то линейный вид уже не получается
Записан
ysv_
Помогающий

ua
Offline Offline

« Ответ #4 : 26-12-2003 21:05 » 

А нельзя аргументы и результаты передавать и ролучать не через глобальные переменные (arg1, arg2, ..., argN и retValue1, retValue2, ..., retValueM), а через глобальные массивы (arg[N] и retValue[M]). После этого проще будет написать единый обработчик таблиц.
А насчет wrapper'a - пример:
void Wrapper(int* inTableRow, int* outTableRow, void (*funcToTest)())
{
  arg1 = inTableRow[0];
  arg2 = inTableRow[1];
  funcToTest();
  TS_ASSERT( retValue1 == outTableRow[0] );
  TS_ASSERT( retValue2 == outTableRow[1] );
}
А если подробнее что нужно тестировать может подскажу больше. Некоторый опыт использования TDD (в рамках XP) есть. Правда для C++. Улыбаюсь
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #5 : 26-12-2003 23:37 » 

Тогда второй тупой вопрос, на каком языке?

Тут в старом форуме в архиве есть примеры и обсждение вопроса - как сделать функцию в С++ типа printf() которая принимает разное колличество входящих параметров.
Если не ошибаюсь то описывается примерно так.

func ( int col, int ...);

де первый параметр - принимает колличество орбабатываемых входных параметров.
Указал неправильно - я не виноват.

Его можно указывать каким угодно в принципе - примером служит сама функция printf где в первом параметре указывается формат входных параметров.
Но тут проблема - в нашем случае все параметры будут типа int - т.е. нельзя сделать вход разнотипных параметров.

Правда выход еще проще - сделать набор функций для разных входных параметров задаваемых по типу switch или же передовать все типа void * разбираясь уже внтри как это все распаковывать.
Записан

А птичку нашу прошу не обижать!!!
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #6 : 26-12-2003 23:50 » new

Не знаю о чем вы Улыбаюсь  но ведь можно пердавать указатели и можно у знать тип на который ссылается указатель и еще ожно создать таблицу типов и передавать вместо одной переменной пару т.е. переменныю и код типа переменной. А еще есть шаблоны и принудительное приведение типов. Правдо это всё для C++. Ну чего знаю то и пишу. Отлично
Записан

Странно всё это....
comm
Гость
« Ответ #7 : 27-12-2003 16:22 » 

Цитата: ysv_
А нельзя аргументы и результаты передавать и ролучать не через глобальные переменные (arg1, arg2, ..., argN и retValue1, retValue2, ..., retValueM), а через глобальные массивы (arg[N] и retValue[M]). После этого проще будет написать единый обработчик таблиц.
А насчет wrapper'a - пример:
void Wrapper(int* inTableRow, int* outTableRow, void (*funcToTest)())
{
  arg1 = inTableRow[0];
  arg2 = inTableRow[1];
  funcToTest();
  TS_ASSERT( retValue1 == outTableRow[0] );
  TS_ASSERT( retValue2 == outTableRow[1] );
}


o!  этот вариант я не просчитывал. но вызов здесь имхо будет но совсем кузявым Жаль

type arg[]={
  {0, 0 },
  {1, 0 },
  {2, 0 }
}
type ret[]={
  { 0 },
  { 1 }.
  { 2 }
}
doAssert( arg, ret, myfunc );

здесь будет сложно визуально отслеживать соответсвие arg[n] и ret[n]

но за идею спасибо! может быть получится обыграть

Цитата: ysv_

А если подробнее что нужно тестировать может подскажу больше. Некоторый опыт использования TDD (в рамках XP) есть. Правда для C++. Улыбаюсь


я применяю концепцию ООП на GNU C, то есть все разнесено по подсистемам которые имеют пространства имен, области видимости и тд
при этом в процессе работы подсистемы куча переменных импортируется из глобальной среды и экспортируется туда же
Записан
ysv_
Помогающий

ua
Offline Offline

« Ответ #8 : 29-12-2003 12:31 » 

Цитата

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

А вот ИМХО не есть гуд. Тем более, если применяется ООП.
Записан
comm
Гость
« Ответ #9 : 29-12-2003 20:52 » 

Цитата: ysv_
Цитата

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

А вот ИМХО не есть гуд. Тем более, если применяется ООП.


ООП ОППу рознь, я применяю ОО Проректирование, то есть дизайн системы сделан ОО, при этом есть задачи которые весьма плохо ложатся в ОО дизайн ( числодробилка )

хотя даже если уменьшить глобальное пространство имен, сабж (тема) все равно остается %)
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines