Тестирование Java. Использование тестовых классов по сравнению с использованием JUnit (или что-то подобное) [duplicate]

Вам нужна моя утилита xtr, но вы можете сделать это с помощью bash script. Это сценарий, который я называю bin2inc. Первый параметр - это имя результирующего char[] variable. Второй параметр - имя file. Результатом является C include file с кодированным содержимым файла (в нижнем регистре hex) в качестве имени переменной. char array - zero terminated, а длина данных сохраняется в $variableName_length

#!/bin/bash

fileSize ()

{

    [ -e "$1" ]  && {

        set -- `ls -l "$1"`;

        echo $5;

    }

}

echo unsigned char $1'[] = {'
./xtr -fhex -p 0x -s ', ' < "$2";
echo '0x00'
echo '};';
echo '';
echo unsigned long int ${1}_length = $(fileSize "$2")';'

ВЫ МОЖЕТЕ ПОЛУЧИТЬ XTR ЗДЕСЬ xtr (символ eXTRapolator) - GPLV3

123
задан Rob Kielty 4 June 2012 в 20:03
поделиться

11 ответов

Это не тестирование, это «поиск вручную на выходе» (известный в бизнесе как LMAO). Более формально это называется «поиск вручную ненормального выхода» (LMFAO). (См. Примечание ниже)

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

Теперь масштабируйте до 50k, 250k, 1m LOC или более и LMFAO при каждом изменении кода. Мало того, что это неприятно, это невозможно: вы расширили комбинацию входов, выходов, флагов, условий, и трудно реализовать все возможные ветви.

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

[/g3]

Наконец, тесты на единицу и поведение определить поведение системы . Тесты могут выполняться сервером непрерывной интеграции и проверяться на правильность. Конечно, возможно, System.out s, но сервер CI не узнает, является ли один из них неправильным, и если это так, они являются модульными тестами, и вы также можете использовать фреймворк.

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


Примечание: Как указано (грубо) в комментариях, LMAO является , но в смысле очень ограниченным. Он не может быть воспроизведен каким-либо значимым образом по всему проекту или как часть процесса. Это похоже на постепенное развитие в REPL, но никогда не формализуя эти инкрементные тесты.

126
ответ дан Community 19 August 2018 в 03:52
поделиться
  • 1
    +1 - «Просмотр вручную на выходе». Кроме того, я думаю, что Дэйв ударил ноготь прямо по голове. То, что делает op, - это, безусловно, тестирование not . – jmort253 2 June 2012 в 01:57
  • 2
    @Truth Я полагаю, что можно делать острые наблюдения, используя только визуальный контроль :-) Хорошее определение ответа на окончательный вопрос, присутствующий в списке значков Дейва. – Rob Kielty 2 June 2012 в 20:33
  • 3
    -1 для первого предложения, которое совершенно и совершенно неверно. – Michael Borgwardt 11 August 2012 в 21:50
  • 4
    @KevinG Это ... конечно, подход. – Dave Newton 22 June 2017 в 11:36
  • 5
    @KevinG Я думаю, что это плохой подход. Если это только вы работаете над кодом, это менее вредно, но не подход, который я когда-либо рекомендовал бы кому бы то ни было. Отслеживание ошибок, хороший подход. Полностью настраиваемый код, который изобретает несколько колес, нет. – Dave Newton 23 June 2017 в 01:04

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

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

есть еще некоторые дополнительные функции в JUnit, например

Утверждение утверждения

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

. Некоторые из этих методов:

  1. fail([message]) - Сбой теста. Может быть использован для проверки того, что определенная часть кода не достигнута. Или выполнить тест с ошибкой до того, как будет реализован тестовый код.
  2. assertTrue(true) / assertTrue(false) - всегда будет true / false. Может использоваться для предопределения результата теста, если тест еще не реализован.
  3. assertTrue([message,] condition) - Проверяет, что логическое значение condition истинно.
  4. assertEquals([message,] expected, actual) - Тесты равны ли два значения (в соответствии с методом equals, если они реализованы, в противном случае с использованием == сравнения ссылок). Примечание. Для массивов эта ссылка проверяется, а не содержимое, для этого используйте assertArrayEquals([message,] expected, actual).
  5. assertEquals([message,] expected, actual, delta) - Проверяет, имеются ли два значения с плавающей точкой или двойные значения находятся на некотором расстоянии друг от друга, контролируются значением delta.
  6. assertNull([message,] object) - Проверяет, что объект имеет значение null

и т. д. См. Полный Javadoc для всех примеров здесь .

Suites

С наборами тестов вы можете в определенном смысле объединить несколько тестов классы в один блок, чтобы вы могли выполнить их все сразу. Простой пример: объединение тестовых классов MyClassTest и MySecondClassTest в один набор под названием AllTests:

import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;

@RunWith(Suite.class)
@SuiteClasses({ MyClassTest.class, MySecondClassTest.class })
public class AllTests { } 
9
ответ дан Adowrath 19 August 2018 в 03:52
поделиться

JUnit - это единый модуль тестирования для языка программирования Java. Это важно в разработке, основанном на тестах, и является одним из семейства модулей модульного тестирования, которые в совокупности известны как xUnit.

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

Особенности JUnit - это среда с открытым исходным кодом, которая используется для написания & amp;

Предоставляет аннотацию для определения методов тестирования.

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

Предоставляет тестовые ролики для запуска тестов.

Тесты JUnit позволяют быстрее писать код, который повышает качество

. JUnit элегантно прост. Он менее сложный & amp; занимает меньше времени.

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

Тесты JUnit могут быть организованы в тестовые классы, содержащие тестовые примеры и даже другие тестовые пакеты.

Junit показывает ход теста в бар, зеленый, если тест идет нормально, и при кратковременном тестировании он становится красным.

4
ответ дан AKKI 19 August 2018 в 03:52
поделиться

Когда вы тестируете что-то вроде System.out, вы проверяете только небольшое количество возможных вариантов использования. Это не очень тщательно, когда вы имеете дело с системами, которые могут принимать почти бесконечное количество разных входов.

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

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

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

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

11
ответ дан jmort253 19 August 2018 в 03:52
поделиться

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

0
ответ дан mohit sarsar 19 August 2018 в 03:52
поделиться

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

6
ответ дан n00begon 19 August 2018 в 03:52
поделиться

Вы не можете написать какой-либо тестовый пример без использования рамки тестирования, иначе вам придется написать свой тест framewok, чтобы отдать должное вашим тестовым случаям. Вот некоторые сведения о JUnit Framework, кроме того, что вы можете использовать среду TestNG.

Что такое Junit?

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

Важные особенности тестирования Junit -

  1. [2]
  2. Предоставляет различные типы аннотаций для идентификации методов тестирования.
  3. Предоставляет различные типы утверждений для проверки результатов
  4. Он также дает тестовые ролики для эффективного выполнения тестов.
  5. Это очень просто и, следовательно, экономит время.
  6. В нем описаны способы организации ваши тестовые примеры в виде тестовых костюмов.
  7. Это дает результаты теста случайным и элегантным способом.
  8. Вы можете интегрировать jUnit с Eclipse, Android Studio, Maven & amp; Ant, Gradle и Jenkins
48
ответ дан Rob Kielty 19 August 2018 в 03:52
поделиться

JUNIT: НАБЛЮДЕНИЕ И РЕГУЛИРОВАНИЕ

Вот моя перспектива JUNIT.

JUNIT можно использовать для: 1) Наблюдать за поведением системы, когда новый блок добавляется в эту систему , 2) Внесите корректировки в систему, чтобы приветствовать «новое» устройство в системе. Какие? Точно.

Реальная жизнь, например

Когда ваш родственник посещает комнату в общежитии вашего колледжа, 1) вы будете притворяться более ответственными. 2) Вы будете хранить все, где должны быть, например, обувь в стойке для обуви не на стуле, одежда в шкафу не на стуле. 3) Вы избавитесь от всех контрабанд. 4) вы начнете чистку в каждом устройстве, которое у вас есть.

В терминах программирования

Система: ваш код UNIT: новая функциональность. Поскольку среда JUNIT используется для языка JAVA, поэтому JUNIT = JAVA UNIT (возможно, будет).

Предположим, что у вас уже есть код с пуленепробиваемым кодом, но появилось новое требование, и вам нужно добавить новое требование в свой код. Это новое требование может нарушить ваш код для некоторого ввода (testcase).

. Легкий способ адаптации этого изменения - использовать модульное тестирование (JUNIT). Для этого вы должны написать несколько тестовых файлов для своего кода при создании своей кодовой базы. И всякий раз, когда приходит новое требование, вы просто запускаете все тестовые примеры, чтобы проверить, не завершился ли какой-либо тест. Если «Нет», вы являетесь художником BadA **, и вы готовы развернуть новый код. Если какой-либо из тест-систем не работает, вы меняете свой код и снова запускаете тестовые файлы, пока не получите зеленый статус.

0
ответ дан Rohit Singh 19 August 2018 в 03:52
поделиться

У меня немного другая перспектива, почему нужен JUnit.

Вы можете написать все тестовые примеры самостоятельно, но это громоздко. Вот проблемы:

  1. Вместо System.out мы можем добавить if(value1.equals(value2)) и вернуть 0 или -1 или сообщение об ошибке. В этом случае нам нужен «основной» тестовый класс, который запускает все эти методы и проверяет результаты и поддерживает, какие тестовые случаи не выполнялись и которые передаются.
  2. Если вы хотите добавить еще несколько тестов, вам нужно добавить их к этому «основному» классу испытаний. Изменения существующего кода. Если вы хотите автоматически обнаруживать тестовые примеры из тестовых классов, тогда вам нужно использовать отражение.
  3. Все ваши тесты и ваш основной класс для запуска тестов не обнаруживаются eclipse, и вам нужно написать настраиваемую отладку / запуск конфигурации для запуска этих тестов. Тем не менее, вы все еще не видите эти яркие зеленые / красные выходы.

Вот что делает JUnit:

  1. Он имеет методы assertXXX(), которые полезны для печати полезных сообщений об ошибках из условий и передачи результатов в " основной "класс.
  2. « основной »класс называется runner, который предоставляется JUnit, поэтому нам не нужно писать. И он автоматически определяет методы теста путем отражения. Если вы добавите новые тесты с аннотацией @Test, то они будут автоматически обнаружены.
  3. JUnit имеет интеграцию eclipse и интеграцию maven / gradle, поэтому легко запускать тесты, и вам не придется писать собственные

Я не эксперт в JUnit, поэтому я понял, что сейчас добавлю еще больше.

2
ответ дан Sreekar 19 August 2018 в 03:52
поделиться
  • 1
    Я предполагаю, что в первой части вы написали, что бы мы сделали, если бы JUnit не был там, чтобы сделать тестирование устройства немного лучше, чем инструкции system.out.println. Может быть, JUnit является результатом таких попыток некоторых программистов, и они почувствовали необходимость написать отдельную платформу тестирования для выполнения этой автоматизации, таким образом, JUnit родился, может быть. – Saurabh Patil 22 August 2016 в 15:48

Я добавил, что некоторые другие System.out НЕ МОГУ сделать:

  • Независимо от каждого из тестовых случаев (это важно) JUnit может это сделать: каждый раз, когда будет создан новый экземпляр тестового примера, и @Before.
  • Отдельный код тестирования из источника JUnit может это сделать.
  • Интеграция с CI JUnit может сделать это с помощью Ant и Maven.
  • Устанавливать и комбинировать тестовые примеры легко JUnit может выполнять @Ignore и набор тестов.
  • Easy Чтобы проверить результат, JUnit предлагает множество методов Assert (assertEquals, assertSame ...)
  • Макет и заглушка позволяют сосредоточиться на тестовом модуле. JUnit может делать: используя макет и заглушку, вы настраиваете правильное приспособление и фокусируетесь на логике тестового модуля.
8
ответ дан 卢声远 Shengyuan Lu 19 August 2018 в 03:52
поделиться
48
ответ дан Rob Kielty 30 October 2018 в 15:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: