Программирование. Принципы и практика использования C++ Исправленное издание
Шрифт:
public:
void draw const; // задает цвет и рисует линии
virtual void move(int dx, int dy); // перемещает фигуру
// на +=dx и +=dy
void set_color(Color col);
Color color const;
void set_style(Line_style sty);
Line_style style const;
void set_fill_color(Color col);
Color fill_color const;
Point point(int i) const; //
доступ к точкам без права
// модификации
int number_of_points const;
virtual ~Shape { }
protected:
Shape;
virtual void draw_lines const; // рисует соответствующие точки
void add(Point p); // добавляет точку p
void set_point(int i,Point p); // points[i]=p;
private:
vector<Point> points; // не используется всеми
// фигурами
Color lcolor; // цвет для линий и символов
Line_style ls;
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<Point> points;
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";
Поделиться с друзьями: