Хорошие практики для модульного тестирования иерархий классов - PullRequest
0 голосов
/ 11 апреля 2019

Каковы общие / общепринятые практики для иерархии классов модульного тестирования?

Я пытался найти разные вопросы, связанные с этой проблемой, но не смог найти исчерпывающего.

Предположим, что тестируется иерархия.

class Base 
{
        int base_internal() { return 10;}                

    public:
        int virtual do_f() { return 0; }

        int execute() {
            return do_f()*base_internal();
        }
};

class DerrivedA : public Base
{
        int a_specefic() { return 4; }

    public:
        int virtual do_f()  { return a_specefic(); }
};


class DerrivedB : public Base
{
        int b_specefic() { return 8; }

    public:
        int virtual do_f()  { return b_specefic(); }
};

Теперь, что касается инфраструктуры модульного тестирования, я думаю о двух стратегиях.

Стратегия 1. Имейте класс "тестер" для каждого типа, производный от соответствующего класса и проведите тестирование

class TestForBase : public Base {...};
class TestForDerrivedA : public DerrivedA {...};
class TestForDerrivedB : public DerrivedB {....};

Стратегия 2. Используйте «согласованную» версию шаблона проектирования посетителя (которая будет иметь один TestVisitor), затем измените каждый тестируемый класс с помощью метода accept () и проведите тестирование внутри visit () класса Тестер

class Base 
{
        void accept(Tester& t);
        int base_internal();

    public:
        int virtual do_f();
        int execute();
};


class Derrived : public Base
{
        void accept(Tester& t);
        int a_specefic();

    public:
        int virtual do_f();
};

struct Tester
{
        void visit(Base* b)  { ... };
        void visit(Derrived* d) { ... } ;
};

Какие есть другие варианты?

...