Color fcolor; // цвет заполнения
Shape(const Shape&); // предотвращает копирование
Shape& operator=(const Shape&);
};
Как приступить к тестированию этого класса? Сначала рассмотрим, чем класс Shape
отличается от функции binary_search
с точки зрения тестирования.
• Класс Shape
имеет несколько функций.
• Состояние объекта класса Shape
может изменяться (мы можем добавлять точки, изменять цвет и т.д.), т.е. одна функция может влиять на другую.
• Класс Shape
имеет виртуальные функции. Другими словами, поведение объекта класса Shape
зависит от того, какой производный класс был создан на его основе (если такой класс существует).
• Класс Shape
не является алгоритмом.
• Изменение объекта класса Shape
может влиять на содержимое экрана.
Shape
. Это не соответствует принципам систематичного, воспроизводимого и доступного тестирования. Как указывалось в разделе 26.3.4.1, мы часто прибегаем к разным уловкам, чтобы избежать этого. Однако пока будем предполагать, что существует наблюдатель, который замечает отклонения изображения от требуемого образца.
Shape
могут считывать точки, но не могут их изменять. С точки зрения тестирования все, что не вносит изменений (или, по крайней мере, не должно вносить), облегчает работу.
Что мы можем тестировать, а что не можем? Для того чтобы тестировать класс Shape
, мы должны попытаться протестировать его как отдельно, так и в сочетании с производными классами. Однако, для того чтобы проверить, что класс Shape
работает правильно с конкретным производным классом, мы должны протестировать этот производный класс.
Ранее мы уже отметили, что объект класса Shape
имеет состояние (значение), определенное четырьмя данными-членами.
vector
Color lcolor; // цвет линий и символов
Line_style ls;
Color fcolor; // цвет заполнения
Все, что мы можем сделать с объектом класса Shape
, — внести в него изменения и посмотреть, что произойдет. К счастью, изменить данные-члены можно только с помощью интерфейса, определенного функциями-членами.
Простейшим объектом класса Shape
является объект класса Line
, поэтому начнем с создания одного такого объекта и внесем все возможные изменения (используя самый наивный стиль тестирования).
Line ln(Point(10,10), Point(100, 100));
ln.draw(); // смотрим, что произошло
// проверка точек:
if (ln.number_of_points() != 2)
cerr << "Неправильное количество точек ";
if (ln.point(0)!=Point(10,10)) cerr << "Неправильная точка 1";
if (ln.point(1)!=Point(100,100)) cerr << "Неправильная точка 2";
for (int i=0; i<10; ++i) { // смотрим на перемещения объекта
ln.move(i+5,i+5);
ln.draw();
}
for (int i=0; i<10; ++i) { // проверяем, возвращается ли объект
// в исходное положение
ln.move(i–5,i–5);
ln.draw();
}
if (point(0)!=Point(10,10))
cerr << "Неправильная точка 1 после перемещения";
if (point(1)!=Point(100,100))
cerr << "Неправильная точка 2 после перемещения";
for (int i = 0; i<100; ++i) { // смотрим, правильно ли изменяются
// цвета
ln.set_color(Color(i*100));
if (ln.color() != Color(i*100))
cerr << "Неправильное значение set_color";
ln.draw();
}
for (int i = 0; i<100; ++i) { // смотрим, правильно ли изменяется
// стиль
ln.set_style(Line_style(i*5));
if (ln.style() != Line_style(i*5))
cerr << "Неправильное значение set_style";
ln.draw();
}