Как правило, Вы сделали бы это с выбором мыши (возможно Ctrl Ins или Ctrl C после выбора) и затем, когда в строке команды/поиска, щелкнув средней кнопкой (или Сдвиг Ins или Ctrl V ).
Иначе, должен записать Вашу строку команды/поиска в текстовом буфере со всем редактированием, доступным в текстовых буферах, начиная с :
и все, тогда, на строке, сделать:
"add@a
, который сохранит целую командную строку в буфере a
, и затем выполнит его. Это не будет сохранено в истории команд, все же.
Попытка, создающая следующую строку в тексте, буферизуют как пример для нажатий клавиш выше:
:%s/$maximumTotalAllowedAfterFinish/$minimumTotalAllowedAfterFinish/g
Наконец, можно войти q:
для ввода редактирования истории в текстовый буфер.
Вы, конечно, можете разделить тесты в подкаталоги под t, с любой схемой категоризации. Если вы используете переменную среды, я бы рекомендовал установить значение по умолчанию (если переменная не задана) для запуска всех тестов. Я видел ситуации, когда t / содержит только тесты, которые обычно запускаются при разработке, а другие тесты помещаются в другой каталог (например, t-selenium /).
Я думаю, что все сводится к тому, что последовательность важнее того, какой выбор вы делаете; почти все будет работать, если вы будете последовательны.
Выполните proof --state = all, сохраните
один раз, чтобы добавить некоторую информацию в .prove
.
Выполните proof --state = slow -j9
, если у вас многоядерный компьютер, и ваши тесты могут выполняться одновременно.
Это приведет к тому, что ваши самые длительные тесты будут запущены в начале, так что они с большей вероятностью завершатся до того, как будут выполнены все ваши другие тесты. Это может сократить общее время до завершения, не мешая запуску тестов.
Обычно тесты только для авторов помещаются в каталог xt . Они запускаются вручную. Итак, если ваши длинные тесты предназначены только для авторов, используйте xt . В общем, t является общим для модулей CPAN. Для личного пользования вы можете положить их где угодно.
Для связывания программ, использующих 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
Некоторые люди любят использовать доказать
, чтобы сделать то же самое.
В конечном итоге я запускаю полный набор тестов только тогда, когда мне требуется интеграционное тестирование, чтобы убедиться, что мои изменения сломали что-либо еще.