Эффективное тестирование в C ++ с заглушками и издевательствами? (возможный?) - PullRequest
1 голос
/ 24 сентября 2010

Мне нужен совет по стилю для тестирования этого кода (Objective-) C ++, я заключил в скобки часть Objective, так как не думаю, что она должна иметь какое-либо отношение к этому тесту.

class Probe
{
  public:
    bool playing();
}

bool Probe::playing()
{
  NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
  iTunesApplication *iTunes = [SBApplication applicationWithBundleIdentifier:@"com.apple.iTunes"];

  // Logic here to determine if iTunes is playing requires a running iTunes.
  // The behavior can also differ depending if iTunes is playing a DVD, CD, 
  // Stream, a File, something from the iTunes store, and a bunch of other factors

  [pool release];
  return 1;
}

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

Как эффективно проводить тестирование в таких условиях, когда вы полагаетесь на скрипт-мост, или на адаптер com, или на вышестоящий API. Например, я хочу убедиться, что другой метод print_whats_playing() ничего не печатает, если ничего не воспроизводится, или что какое-то другое условие выполняется нормальным образом.

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

В моем доме (Ruby-land) вы могли бы «заглушить» (см. http://martinfowler.com/articles/mocksArentStubs.html) или «высмеять» роль, что в Ruby легко, потому что вы можете просто переопределить тестовый класс.

Кроме того, в отдельных тестовых примерах вы можете использовать методы короткого замыкания, например, probe.expects(:playing).once.returns(false) - естественно, в C ++ все будет не так просто, но, возможно, есть что-то, чем я могу наслаждаться?

Ответы [ 2 ]

1 голос
/ 03 октября 2010

Если вы все еще ищете настоящую среду Mocking в C ++, вам следует проверить Isolator ++ от Typemock. Он может подделать любой вызов в C ++, единственный недостаток с вашей точки зрения, что в настоящее время он работает только в Windows.

0 голосов
/ 27 сентября 2010

Итак, я нашел свое решение, наткнувшись на удивительно хорошо наделенный список в википедии фреймворков для тестирования C ++, я наткнулся на GoogleTest и Google C ++ Mocking Framework . Который отвечает всем моим требованиям, хотя он немного сложнее в использовании, чем аналоги Ruby, он одинаково хорошо представлен.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...