singalen: (Default)
[personal profile] singalen

JUnit Cookbook

Kent Beck, Erich Gamma

оригинал

Простейший случай

Как писать тестирующий код?
Простейший способ – написать проверочное выражение в отладчике. Это выражение можно менять без перекомпиляции, и можно сверить то, что вы пишете, с живыми объектами запущенной программы. Ещё можно написать тестовый вывод в stdout. Оба эти варианта тестов ограничены – они требуют, чтобы результаты тестирования анализировал человек. К тому же, вы можете одновременно отлаживать только один участок кода, а программа с большим количеством отладочной печати вызывает ужасную “скроллерную слепоту” (“scroll blindness”).
Тесты JUnit не требуют человеческого суждения, и вы можете запустить большое их количество выполняться одновременно. Когда вы хотите протестировать что-либо, вы:
  1. Наследуете класс от TestCase;
  2. Пишете конструктор, принимающий String и передающий его родителю;
  3. Переопределяете метод runTest();
  4. Чтобы проверить некоторое значение, вызываете assertTrue() и передаёте ему булевское значение, означающее, успешна ли проверка.
Например, тест для суммирования двух значений класса Money выглядит так:
public void testSimpleAdd() {
    Money m12CHF = new Money(12, "CHF");
    Money m14CHF = new Money(14, "CHF");
    Money expected = new Money(26, "CHF");
    Money result = m12CHF.add(m14CHF);
    assertTrue(expected.equals(result));
}
Код для CppUnit Если хотите написать тест, похожий на уже написанный, используйте Fixture вместо TestCase. Если нужно написать более одного теста, используйте Suite.

TestRunner

Как запустить тест и получить его результаты.
public static Test suite() {
    TestSuite suite = new TestSuite();
    suite.addTest(new MoneyTest("testMoneyEquals"));
    suite.addTest(new MoneyTest("testSimpleAdd"));
    return suite;
}

public static void main(String args[]) {
    junit.textui.TestRunner.run(suite());
}

Разрешения авторов спрошу чуть пожжее :) Кто знает, как написать Беку и Гамме? :))
Ещё буду переводить Cook's Tour.

Код для CppUnit

#include <cppunit/extensions/HelperMacros.h>
#include "Money.h"

class CMoneyTestCases : public CPPUNIT_NS::TestFixture
{
private:
    CPPUNIT_TEST_SUITE( CMoneyTestCases );
    CPPUNIT_TEST( TestSimpleAdd );
    CPPUNIT_TEST_SUITE_END();

public:
    void TestSimpleAdd();
};


#include <cppunit/BriefTestProgressListener.h>
#include <cppunit/CompilerOutputter.h>
#include <cppunit/extensions/TestFactoryRegistry.h>
#include <cppunit/TestResult.h>
#include <cppunit/TestResultCollector.h>
#include <cppunit/TestRunner.h>

int main(int argc, char* argv[])
{
  // Create the event manager and test controller
  CPPUNIT_NS::TestResult controller;

  // Add a listener that colllects test result
  CPPUNIT_NS::TestResultCollector result;
  controller.addListener( &result );

  // Add a listener that print dots as test run.
  CPPUNIT_NS::BriefTestProgressListener progress;
  controller.addListener( &progress );

  // Add the top suite to the test runner
  CPPUNIT_NS::TestRunner runner;
  runner.addTest( CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest() );
  runner.run( controller );

  // Print test in a compiler compatible format.
  CPPUNIT_NS::CompilerOutputter outputter( &result, std::cerr );
  outputter.write();

  return result.wasSuccessful() ? 0 : 1;
}

Код для NUnit

Upd: найден "официальный перевод" на C++ для CppUnit. Почему-то Бек и Гамма там не упомянуты :)
(deleted comment)
(deleted comment)
(deleted comment)
Posted by [identity profile] vbez.livejournal.com
И если вместе с кодом нету тестов, работа заворачивается.
По крайней мере я в одном ;) проекте так писал.

типа Лаба

16/8/05 00:20 (UTC)
Posted by [identity profile] vbez.livejournal.com
А шо - у вас тоже поддержка старого будет?
Или таки новое пишете?