Как проверить логические деревья - 1 неожиданный результат теста из 10 - PullRequest
0 голосов
/ 03 ноября 2019

Я отправил программу, отвечающую требованиям бизнес-требований, но в ответе, который я получаю, говорится, что 1 из 10 входных данных неверен. Я не уверен, какие входные данные неверны или как их идентифицировать.

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

Войти в систему

Консоль читает 2 строки:

  • Первая строка - минуты - целое положительное число в интервале [0… 10000]
  • Вторая строка - имя игрока - текст

Выход

В первой строке выведите:

  • «Матч только начался!»- если минуты 0.
  • «Первый тайм». - если минуты меньше 45.
  • «Второй тайм». - если минуты 45 или более.

В следующей строке выведите:

  • Если минуты находятся в диапазоне от 1 до 10 включительно: "{имя игрока} пропустилнаказание «.
    • Если в то же время минуты являются четным числом, выведите:
    • "{имя игрока} получил травму после штрафа."
  • Если минуты больше 10 и меньше или равны 35: «{имя игрока} получил желтую карточку».
    • Если в то же время минуты являются нечетным числом, выведите:
    • "{имя игрока} получил еще одну желтую карточку."
  • Еслиминуты больше 35 и меньше 45: "{Имя игрока} SCORED A GOAL !!!"
  • Если минуты больше 45 и меньше или равны 55. "{имя игрока} получилсвободный удар. "
    • Если в то же время минуты являются четным числом, выведите:
    • "{имя игрока} пропустил штрафной удар."
  • Еслиминуты больше 55 и меньше или равны 80. "{имя игрока} пропустил удар с угла".
    • Если в то же время минуты являются нечетным числом,
    • "{имя игрока} было изменено с другим игроком."
  • Еслиминуты больше 80 и меньше или равны 90: "{Имя игрока} ОБНАРУЖИЛ ЦЕЛЬ ОТ ШТРАФА !!!"

Пример ввода и вывода

Login Exit Explanation
85
Harry Kane Second half time.
Harry Kane SCORED A GOAL FROM PENALTY !!! The minutes are over 45 and we print the first line, then we see that they are in the range of 80 to 90 and we print the second line.
10
Messi First half time.
Messi missed a penalty.
Messi was injured after the sentence.
25
Ronaldo First half time.
Ronaldo received a yellow card.
Ronaldo got another yellow card.

Ниже приведена моя программа, но 1 тестовый ввод из 10 дал неправильный ответ. Я не знаю сам ввод, но если бы вы помогли, это бы много значило.

          string name;
          minutes = Convert.ToInt32(Console.ReadLine());
          name = Console.ReadLine();
              if (minutes == 0) Console.WriteLine("Match has just began!");
              else if (minutes < 45) Console.WriteLine("First half time.");
              else Console.WriteLine("Second half time.");
              if (minutes == 0) placeholder = 0;
              else if (minutes > 0 && minutes <= 10) { Console.WriteLine(name + " missed a penalty."); if (minutes % 2 == 0) Console.WriteLine(name + " was injured after the penalty."); }
              else if (minutes <= 35) { Console.WriteLine(name + " received yellow card."); if (minutes % 2 != 0) Console.WriteLine(name + " got another yellow card."); }
              else if (minutes <= 45) Console.WriteLine(name + " SCORED A GOAL !!!");
              else if (minutes <= 55) { Console.WriteLine(name + " got a freekick."); if (minutes % 2 == 0) Console.WriteLine(name + " missed the freekick."); }
              else if (minutes <= 80) { Console.WriteLine(name + " missed a shot from corner."); if (minutes % 2 != 0) Console.WriteLine(name + " has been changed with another player."); }
              else if (minutes <= 90) Console.WriteLine(name + " SCORED A GOAL FROM PENALTY !!!");

1 Ответ

0 голосов
/ 04 ноября 2019

Добро пожаловать на ТАК! Вместо того, чтобы публиковать точные вопросы из домашних заданий, учебных пособий или заданий, вы должны сосредоточиться на Минимальном воспроизводимом примере , который выделяет конкретную проблему, которую вы хотели бы решить. Единственный исходный вопрос в реальном мире может привести к тому, что в SO будет размещено несколько отдельных вопросов, процесс выделения вашего примера часто приводит к большему пониманию и самому решению.

Ваше замечание, что вы знаете, что« 1 тестовый ввод из 10 дал неправильный ответ », но тот факт, что вы не знаете, какой именно, подчеркивает, что вы не пытались запустить этот код самостоятельно для комбинаций вне текста примера.

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

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

85
Harry Kane
Second half time.
Harry Kane SCORED A GOAL FROM PENALTY !!!
10
Messi
First half time.
Messi missed a penalty.
Messi was injured after the penalty.
25
Ronaldo
First half time.
Ronaldo received yellow card.
Ronaldo got another yellow card.

Но теперь вынужно проявить творческий подход и выполнить все критерии, указанные в вопросе, и доказать, что вы можете получить правильный результат.

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

Для логических сценариев, подобных этому, я всегда стараюсь сформулировать тестовый набор или модульные тесты, которые охватывают все граничные условия. Это может быть утомительным процессом, но с больше чем, меньше чем и равно сравнения, это единственный способ быть на 100% уверенным в правильности вашей логики.

Модульное тестирование и Тестовые комплекты - это методы, которые можно использовать для автоматизации тестирования, это код или приложение, которое запускает ваш код и предоставляет конкретные входные данные и сравнивает выходные данные из вашего кода сожидаемый результат.

Позволяет построить Матрицу ожидаемых результатов, но для простоты давайте сосредоточимся только на вводе времени. (как уже упоминалось выше, у вас есть название инъекции). Итак, определите все граничные условия для времени, включая минимальное и максимальное значения, и запишите ожидаемые результаты.

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

"Если минуты находятся в диапазоне от 1 до 10 включительно"
Это требование имеет две границы, 1 и 10, оператор inclusive сообщает нам, что возможный диапазон включаетграничные значения, так или иначе, мы должны проверить следующие значения, чтобы подтвердить, что у нас есть правильные граничные условия: 0,1,2,9,10,11

В программировании довольно распространенослучайно отключено на 1, поэтому эта форма тестирования устраняет эти проблемы.

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

Тестовые примеры вывода первой строки

| Time | Expected First Line     | First Line Output     | Result |  
|------|-------------------------|-----------------------|--------|  
|    0 | Match has just started! |                       |        |  
|    1 | First half time.        |                       |        |  
|   44 | First half time.        |                       |        |  
|   45 | Second half time.       |                       |        |    
|   46 | Second half time.       |                       |        |  
|10000 | Second half time.       |                       |        |  

Тестовые случаи вывода второй строки

Имя игрока для этих тестов будет "Px", что позволит сохранить вывод достаточно маленьким для отображения на этом форуме.

| Time | Expected Second Line              | Second Line Output    | Result |  
|------|-----------------------------------|-----------------------|--------|  
|    0 |                                   |                       |        |  
|    1 | Px missed a penalty.              |                       |        |
|    9 | Px missed a penalty.              |                       |        |  
|   10 | Px missed a penalty.              |                       |        |  
|   11 | Px received a yellow card.        |                       |        |    
|   34 | Px received a yellow card.        |                       |        |  
|   35 | Px received a yellow card.        |                       |        |
|   36 | Px SCORED A GOAL !!!              |                       |        |
|   44 | Px SCORED A GOAL !!!              |                       |        |
|   45 |                                   |                       |        |
|   46 | Px got a freekick.                |                       |        |
|   54 | Px got a freekick.                |                       |        |
|   55 | Px got a freekick.                |                       |        |
|   56 | Px missed a shot from the corner. |                       |        |
|   79 | Px missed a shot from the corner. |                       |        |
|   80 | Px missed a shot from the corner. |                       |        |
|   81 | Px SCORED A GOAL FROM PENALTY !!! |                       |        |
|   89 | Px SCORED A GOAL FROM PENALTY !!! |                       |        |
|   90 | Px SCORED A GOAL FROM PENALTY !!! |                       |        |
|   91 |                                   |                       |        | 
|10000 |                                   |                       |        |

Пока вышеупомянутые условия теста проходят, мы можем пропустить известное граничное тестирование для операторов второй строки и просто проверить границы, которые влияют на третью строку. Однако, поскольку условия третьей строки влияют на любое второе значение (сопоставленное с нечетными или четными числами), используйте границу и пройдите одну целую последовательность внутри диапазона, чтобы быть тщательными или, если вы автоматизируете контрольные примеры, вы должны проверить все возможные значения в пределахдиапазон. Здесь, если диапазон был достаточно большим, я поместил несколько случайных тестовых примеров.

| Time | Expected Third Line                      | Second Line Output    | Result |  
|------|------------------------------------------|-----------------------|--------|  
|    1 |                                          |                       |        |
|    2 | Px was injured after the penalty.        |                       |        |
|    3 |                                          |                       |        |
|    8 | Px was injured after the penalty.        |                       |        |
|    9 |                                          |                       |        |  
|   10 | Px was injured after the penalty.        |                       |        |  
|   11 | Px got another yellow card.              |                       |        |    
|   12 |                                          |                       |        |    
|   13 | Px got another yellow card.              |                       |        |    
|   22 |                                          |                       |        |    
|   27 | Px got another yellow card.              |                       |        |    
|   33 | Px got another yellow card.              |                       |        |    
|   34 |                                          |                       |        |  
|   35 | Px got another yellow card.              |                       |        |
|   36 |                                          |                       |        |
|   44 |                                          |                       |        |
|   45 |                                          |                       |        |
|   46 | Px missed the freekick.                  |                       |        |
|   47 |                                          |                       |        |
|   50 | Px missed the freekick.                  |                       |        |
|   53 |                                          |                       |        |
|   54 | Px missed the freekick.                  |                       |        |
|   55 |                                          |                       |        |
|   56 |                                          |                       |        |
|   57 | Px has been changed with another player. |                       |        |
|   58 |                                          |                       |        |
|   62 |                                          |                       |        |
|   65 | Px has been changed with another player. |                       |        |
|   74 |                                          |                       |        |
|   79 | Px has been changed with another player. |                       |        |
|   80 |                                          |                       |        |
|   81 |                                          |                       |        |
|10000 |                                          |                       |        |

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

Результат теста вывода первой строки

Только конкретныетекстовое значение отличается от бизнес-требования, когда время = ноль

| Time | Expected First Line     | First Line Output     | Result |
|------|-------------------------|-----------------------|--------|
|    0 | Match has just started! | Match has just began! |  FAIL  |  
|    1 | First half time.        | First half time.      |  Pass  |  
|   44 | First half time.        | First half time.      |  Pass  |  
|   45 | Second half time.       | Second half time.     |  Pass  |   
|   46 | Second half time.       | Second half time.     |  Pass  |
|10000 | Second half time.       | Second half time.     |  Pass  |

тестовые примеры для вывода на второй строке

Обратите внимание на орфографические ошибки в выходных данных, "получил желтую карточку" вместо "получил a желтую карточку" и "пропустил удар с угла" вместо "Пропустил выстрел из * угол"

Вы также должны учитывать граничные условия из этого Бизнес-требования:

  • Если минуты больше 35 и меньше 45: "{Имя игрока} ОЦЕНИЛИ ЦЕЛЬ !!!"
  • Если минуты больше 45 и меньше или равны 55. "{игрокname} получил штрафной удар. "

Обратите внимание, что нет условия, соответствующего 45в точности

| Time | Expected Second Line              | Second Line Output                | Result |
|------|-----------------------------------|-----------------------------------|--------|
|    0 |                                   |                                   |  Pass  |
|    1 | Px missed a penalty.              | Px missed a penalty.              |  Pass  |
|    9 | Px missed a penalty.              | Px missed a penalty.              |  Pass  |
|   10 | Px missed a penalty.              | Px missed a penalty.              |  Pass  |
|   11 | Px received a yellow card.        | Px received yellow card.          |  FAIL  |
|   34 | Px received a yellow card.        | Px received yellow card.          |  FAIL  |
|   35 | Px received a yellow card.        | Px received yellow card.          |  FAIL  |
|   36 | Px SCORED A GOAL !!!              | Px SCORED A GOAL !!!              |  Pass  |
|   44 | Px SCORED A GOAL !!!              | Px SCORED A GOAL !!!              |  Pass  |
|   45 |                                   | Px SCORED A GOAL !!!              |  FAIL  |
|   46 | Px got a freekick.                | Px got a freekick.                |  Pass  |
|   54 | Px got a freekick.                | Px got a freekick.                |  Pass  |
|   55 | Px got a freekick.                | Px got a freekick.                |  Pass  |
|   56 | Px missed a shot from the corner. | Px missed a shot from corner.     |  FAIL  |
|   79 | Px missed a shot from the corner. | Px missed a shot from corner.     |  FAIL  |
|   80 | Px missed a shot from the corner. | Px missed a shot from corner.     |  FAIL  |
|   81 | Px SCORED A GOAL FROM PENALTY !!! | Px SCORED A GOAL FROM PENALTY !!! |  Pass  |
|   89 | Px SCORED A GOAL FROM PENALTY !!! | Px SCORED A GOAL FROM PENALTY !!! |  Pass  |
|   90 | Px SCORED A GOAL FROM PENALTY !!! | Px SCORED A GOAL FROM PENALTY !!! |  Pass  |
|   91 |                                   |                                   |  Pass  |
|10000 |                                   |                                   |  Pass  |

Тестовые примеры вывода третьей строки

Все эти условия проходят, в любом случае здесь результат матрицы

| Time | Expected Third Line                      | Third Line Output                        | Result |
|------|------------------------------------------|------------------------------------------|--------|
|    1 |                                          |                                          |  Pass  |
|    2 | Px was injured after the penalty.        | Px was injured after the penalty.        |  Pass  |
|    3 |                                          |                                          |  Pass  |
|    8 | Px was injured after the penalty.        | Px was injured after the penalty.        |  Pass  |
|    9 |                                          |                                          |  Pass  |
|   10 | Px was injured after the penalty.        | Px was injured after the penalty.        |  Pass  |
|   11 | Px got another yellow card.              | Px got another yellow card.              |  Pass  |
|   12 |                                          |                                          |  Pass  |
|   13 | Px got another yellow card.              | Px got another yellow card.              |  Pass  |
|   22 |                                          |                                          |  Pass  |
|   27 | Px got another yellow card.              | Px got another yellow card.              |  Pass  |
|   33 | Px got another yellow card.              | Px got another yellow card.              |  Pass  |
|   34 |                                          |                                          |  Pass  |
|   35 | Px got another yellow card.              | Px got another yellow card.              |  Pass  |
|   36 |                                          |                                          |  Pass  |
|   44 |                                          |                                          |  Pass  |
|   45 |                                          |                                          |  Pass  |
|   46 | Px missed the freekick.                  | Px missed the freekick.                  |  Pass  |
|   47 |                                          |                                          |  Pass  |
|   50 | Px missed the freekick.                  | Px missed the freekick.                  |  Pass  |
|   53 |                                          |                                          |  Pass  |
|   54 | Px missed the freekick.                  | Px missed the freekick.                  |  Pass  |
|   55 |                                          |                                          |  Pass  |
|   56 |                                          |                                          |  Pass  |
|   57 | Px has been changed with another player. | Px has been changed with another player. |  Pass  |
|   58 |                                          |                                          |  Pass  |
|   62 |                                          |                                          |  Pass  |
|   65 | Px has been changed with another player. | Px has been changed with another player. |  Pass  |
|   74 |                                          |                                          |  Pass  |
|   79 | Px has been changed with another player. | Px has been changed with another player. |  Pass  |
|   80 |                                          |                                          |  Pass  |
|   81 |                                          |                                          |  Pass  |
|10000 |                                          |                                          |  Pass  |

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

Если я провожу ваш код через все числа от 0 до 91, вы получите 40 правильных и 51 неправильных, исправление только выделенных проблем должно быть очень простым. Я надеюсь, вы сможете увидеть, как построение матрицы условий и результатов испытаний может помочь вам изолировать ответвления в бизнес-требованиях и как проверить наличие явных границ или предельных областей отказа.

Это особыйСам по себе навык, который вам понадобится развивать, если вы собираетесь стать хорошим инженером-программистом. Я выполнил это упражнение в коде, потому что я по сути ленивый парень, но пока вы не разработаете методы кода для этого, логические матрицы оченьЛегко оценить на бумаге, это поможет вам определить правильные входные данные для использования при самостоятельном тестировании вашего кода, прежде чем вы зарегистрируете его для рецензирования. Многие разработчики упускают из виду силу или самопроверку для большего количества условий, чем те, которые они придумали во время разработки. Не проверяйте код, в котором вы не уверены на 100% и не уверены на 100%, если вы не проверяли 100% возможных комбинаций в своих логических деревьях.

...