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

Как правило, Вы сделали бы это с выбором мыши (возможно Ctrl Ins или Ctrl C после выбора) и затем, когда в строке команды/поиска, щелкнув средней кнопкой (или Сдвиг Ins или Ctrl V ).

Иначе, должен записать Вашу строку команды/поиска в текстовом буфере со всем редактированием, доступным в текстовых буферах, начиная с : и все, тогда, на строке, сделать:

"add@a

, который сохранит целую командную строку в буфере a, и затем выполнит его. Это не будет сохранено в истории команд, все же.

Попытка, создающая следующую строку в тексте, буферизуют как пример для нажатий клавиш выше:

:%s/$maximumTotalAllowedAfterFinish/$minimumTotalAllowedAfterFinish/g

Наконец, можно войти q: для ввода редактирования истории в текстовый буфер.

14
задан brian d foy 18 January 2010 в 17:40
поделиться

4 ответа

Вы, конечно, можете разделить тесты в подкаталоги под t, с любой схемой категоризации. Если вы используете переменную среды, я бы рекомендовал установить значение по умолчанию (если переменная не задана) для запуска всех тестов. Я видел ситуации, когда t / содержит только тесты, которые обычно запускаются при разработке, а другие тесты помещаются в другой каталог (например, t-selenium /).

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

8
ответ дан 1 December 2019 в 12:13
поделиться

Выполните proof --state = all, сохраните один раз, чтобы добавить некоторую информацию в .prove .

Выполните proof --state = slow -j9 , если у вас многоядерный компьютер, и ваши тесты могут выполняться одновременно. Это приведет к тому, что ваши самые длительные тесты будут запущены в начале, так что они с большей вероятностью завершатся до того, как будут выполнены все ваши другие тесты. Это может сократить общее время до завершения, не мешая запуску тестов.

10
ответ дан 1 December 2019 в 12:13
поделиться

Обычно тесты только для авторов помещаются в каталог xt . Они запускаются вручную. Итак, если ваши длинные тесты предназначены только для авторов, используйте xt . В общем, t является общим для модулей CPAN. Для личного пользования вы можете положить их где угодно.

3
ответ дан 1 December 2019 в 12:13
поделиться

Согласно документации ASIO :

Для связывания программ, использующих Boost.Asio:

  • Boost.System для классов boost::system::error_code и boost::system::system_error, должны быть доступны следующие библиотеки.
  • Boost.Regex (необязательно), если используется какая-либо из перегрузок read_until () или async_read_until (), имеющих параметр boost:: regex.
  • OpenSSL (необязательно), если вы используете поддержку SSL Boost.Asio.

Если вы посмотрите на ошибку ссылки, вы увидите, что она ищет библиотеку Boost.System. Я бы попытался изменить ваш CMakLists.txt следующим образом:

find_package(Boost 1.40.0 REQUIRED system)
-121--3942015-

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

struct IFoo 
{
    virtual void foo() = 0;
};

struct IBar 
{
    virtual void bar() = 0;
};

struct IFooAndBar : public IFoo, public IBar {};

class FooAndBarCompositor : public IFooAndBar
{
public:
    template <class T>
    FooAndBarCompositor(T* pImpl) : m_pFoo(pImpl), m_pBar(pImpl) {}

    void foo() {m_pFoo->foo();}
    void bar() {m_pBar->bar();}

private:
    IFoo* m_pFoo;
    IBar* m_pBar;
};

Затем вы пишете функцию, которая принимает IFooAndBar *, если требуются оба интерфейса, и вызывающий может создать FooAndBarCompositor на стеке, который отправляется на выбранный объект. Выглядит так:

void testFooAndBar(IFooAndBar* pI) {}

void baz(Fred* pFred)
{
    FooAndBarCompositor fb(pFred);
    testFooAndBar(&fb);
}

Это не очень общее, и заставляет писать диспетчерские функции в композиторе. Другой подход состоит в том, чтобы иметь общий шаблон составителя интерфейса:

template <class IA, class IB>
class InterfaceCompositor
{
public:
    template <class T>
    InterfaceCompositor(T* pObj) : m_pIA(pObj), m_pIB(pObj) {}

    IA* AsA() const {return m_pIA;}
    operator IA* () const {return AsA();}
    IB* AsB() cosnt {return m_pIB;}
    operator IB* () const {return AsB();}

private:
    IA* m_pIA;
    IB* m_pIB;
};

Тогда функция выглядит следующим образом:

void testFooAndBar(InterfaceCompositor<IFoo, IBar> pI)
{
    IFoo* pFoo = pI; // Or pI.AsA();
    IBar* pBar = pI; // Of pI.AsB();
}

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

При использовании общего кода можно использовать тот же шаблон для обеспечения поддержки объектом как IBar, так и IBaz.

C++ 0x введет вариадные шаблоны, которые позволят расширить эту концепцию на произвольные числа классов интерфейсов.

-121--4716590-

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

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

 % perl -Mblib t/some_test.t

Некоторые люди любят использовать доказать , чтобы сделать то же самое.

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

3
ответ дан 1 December 2019 в 12:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: