О необходимости самотестирования программы, пример

Пример программы, которая выполняет самотестирование. Рассмотрим программу, которая складывает и вычитает числа.

#include <cstdlib>
#include <iostream>

using namespace std;

int sum(int a, int b) {
return a+b+1;
}

int mul(int a, int b){
return a*b*2;
}

bool testSum(){
 int a = 3;
 int b = 2;
 int expected = 5;
 return 5 == sum(a, b);
}

bool testMul(){
 int a = 5;
 int b = 2;
 int expected = 10;
 return 10 == mul(a, b);
}

bool selfTest(){
 bool flag = true;
 flag = flag && testSum();
 flag = flag && testMul();
 return flag;
}



int main(){

 if ( ! selfTest() ) {
                cout << "self test error";
                exit(0);
        }
else
   {
        cout << "self test: OK \n\r";
   };

 int a = 0;
 int b = 0;
 int res = 0;
 char outbuf[50];
 char ch;

 cin >> a;
 cin >> b;
 res = mul(a, b);
 sprintf(outbuf,  "a * b = %d\n\r",  res);
 cout << outbuf;
 res = sum(a , b);
 sprintf(outbuf,  "a + b = %d\n\r", res);
 cout << outbuf;
 cout << "Press q, enter";
 cin >> ch;
}
Нетрудно увидеть, что в программе есть грубые фактические ошибки. Но формально, с точки зрения компилятора, все верно и программа скомпилируется
gcc selftest.cpp -lstdc++ -o selftest
Этот пример говорит, что компилятор, даже такой совершенный, как gcc не может проверить, верна программа или нет. Тем не менее, внутри кода программы мы делаем самотест, который проверяет, что и сумма, и умножение должны быть верны. И если что-то не так, делаем досрочный выход из программы Теперь исправим реализацию Скомпилируем и запустим заново Программа выполняет самотестирование и убедившись, что все ОК, разрешает произвести действия, в данном случае расчеты.

Теги документа