Как сделать функцию драйвера, если тестируемая функция требует ввода данных пользователем? - PullRequest
0 голосов
/ 19 октября 2019

Я работаю над проектом по ознакомлению моего колледжа с классом cs, в котором мы должны написать «казино». Одним из требований является то, что пользователь может выбрать функцию «контрольный пример», которая при выборе проверяет все наши функции. Проблема в том, как я могу тестировать функции, которые требуют большого количества пользовательского ввода, а также используют много случайных чисел?

Я пытался выяснить, как получить ввод с компьютера вместо пользователяНо я не нашел ничего убедительного. Кроме того, при предоставлении ответов имейте в виду, что это вводный класс, и поэтому мой код не будет ни чистым, ни эффективным, но это то, чему я научился.

Пример игры высокого / низкого уровня для "казино":

void highLowGame(int &currentBalance)
{
  int betAmount;
  int baseNum;
  int secondNum;
  char hOrL;
  char continueYOrN;

  do
  {
    cout << "Your current balance is $" << currentBalance << "\nHow much would you like to bet?\n";
    cin >> betAmount;

    betAmount = correctIntInput(betAmount);
    betAmount = validBet(currentBalance, betAmount);
    baseNum = randomWithMax(9) + 1;

    cout << "The first number is " << baseNum << "\nDo you bet (h)igh, or (l)ow?\n";
    cin >> hOrL;
    hOrL = correctCharInput(hOrL);

    while (!(hOrL == 'l' || hOrL == 'L' || hOrL == 'h' || hOrL == 'H'))
    {
      cout << "Invalid input, please enter 'H' or 'L'\n";
      cin >> hOrL;
    }

    secondNum = randomWithMax(9) + 1;
    cout << "The second number is " << secondNum << "\n";

    if ((((hOrL == 'l') || (hOrL == 'L')) && (secondNum < baseNum)) || (((hOrL == 'h') || (hOrL == 'H')) && (secondNum > baseNum)))
    {
      cout << "Congratulations, you won your bet!\n";
      updateBalance(currentBalance, 1, betAmount, true);
      cout << "Your new balance is " << currentBalance << "\n";
    }
    else
    {
      cout << "Looks like you lost your bet!\n";
      updateBalance(currentBalance, 1, betAmount, false);
      cout << "Your new balance is " << currentBalance << "\n";
    }

    if (currentBalance <= 0)
    {
      cout << "Uh oh, you are bankrupt!\n";
      break;
    }

    cout << "Would you like to play again?\n";
    cin >> continueYOrN;
    continueYOrN = correctCharInput(continueYOrN);

    while (continueYOrN != 'n' && continueYOrN != 'N' && continueYOrN != 'y' && continueYOrN != 'Y')
    {
      cout << "Invalid input, please enter a new input:\n";
      cin >> continueYOrN;
      continueYOrN = correctCharInput(continueYOrN);
    }
    cout << "\n\n\n\n";
  }while(!(continueYOrN == 'n' || continueYOrN == 'N'));

Образец «теста», данного профессором, который проверяет функцию с именем updateBalance (), которая просто выполняет функции, перечисленные в условиях прохождения / сбоя:

void test()
{
  int sampleBalance = 100;
  int sampleBet = 50;
  int samplePayout = 5;
  bool sampleWin = true;

  cout << "Testing updateBalance() win...";
  updateBalance(sampleBalance, sampleBet, samplePayout, sampleWin);
  if (sampleBalance == sampleBalance + samplePayout * sampleBet)
  {
    cout << "Pass!\n";
  }
  else
  {
    cout << "Fail!\n";
  }
}

Извините забольшой блок кода для игры HighLow, я не был уверен, какие части я должен вытащить, если таковые имеются. Я даже не знаю, что ожидать в качестве результата (кроме прохода / неудачи), так как я даже не уверен, как сделать то, что просит профессор. Опять же, я довольно новичок в этом, поэтому мой код может быть грязным или неэффективным, и я в порядке, я просто нуждаюсь в помощи, как выполнить мое задание. Заранее спасибо!

1 Ответ

0 голосов
/ 19 октября 2019

Вы заметите, что пример функции профессора не требует ввода данных пользователем и не имеет случайных элементов.

Если бы я собирался написать тесты для этого, я бы разбил свои методы на более мелкие методы. Затем я бы протестировал методы, в которых нет пользовательского ввода и случайных элементов.

Я заметил, что у вас есть метод correctIntInput(betAmount). Это выглядит как хороший кандидат на тестирование. Напишите несколько тестов, которые соответствуют известным хорошим и плохим значениям, а затем убедитесь, что они дают ожидаемый результат. То же самое с validBet(...) и updateBalance(...).

Этот фрагмент кода также может быть помещен в его собственную функцию и проверен.

if ((((hOrL == 'l') || (hOrL == 'L')) && (secondNum < baseNum)) || (((hOrL == 'h') || (hOrL == 'H')) && (secondNum > baseNum)))
{
  cout << "Congratulations, you won your bet!\n";
  updateBalance(currentBalance, 1, betAmount, true);
  cout << "Your new balance is " << currentBalance << "\n";
}
else
{
  cout << "Looks like you lost your bet!\n";
  updateBalance(currentBalance, 1, betAmount, false);
  cout << "Your new balance is " << currentBalance << "\n";
}

Чем больше вы делаете этот тип вещей, тем большеВы сможете лучше понять, как разбить ваш код, какой тип кода легко тестировать, а какой - сложный. В конце концов вы попадете в такое место, где трудные для тестирования материалы - это лишь малая часть вашей кодовой базы, а остальная часть покрыта тестами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...