prog:: test

Автоматическое сравнение результатов вычисления

Блокноты MuPAD® будут демонтированы в будущем релизе. Используйте live скрипты MATLAB® вместо этого.

Live скрипты MATLAB поддерживают большую часть функциональности MuPAD, хотя существуют некоторые различия. Для получения дополнительной информации смотрите, Преобразовывают Notebook MuPAD в Live скрипты MATLAB.

Синтаксис

prog::test(stmt, res | TrapError = errnr, <Timeout = sec>, <message>, options)
prog::test(stmt)

Описание

prog::test работает в двух различных режимах: интерактивный и в тестовых файлах.

В интерактивном режиме один вызов prog::test может использоваться, чтобы сравнить два оператора MuPAD®.

Вызов prog::test(stmt, res) оценивает оба аргумента stmt и res. Когда оценка приводит к точно тому же объекту MuPAD, и никакой Enhancement не требовали, ничто не распечатано, и prog::test возвращает пустой объект null().

Если результаты отличаются, тестовые сбои и сообщение распечатан.

Дополнительные аргументы описаны в следующей части для использования prog::test в тестовых файлах.

Другой режим использует prog::test в тестовых файлах. Тестовый файл должен запуститься с prog::testinit. Эта функция инициализирует тестовый файл. Затем можно записать несколько тестов с помощью prog::test. Последним оператором в тестовом файле должен быть prog::testexit(). Также можно задать имя протестированной процедуры при помощи print(Unquoted, "testname") после prog::testinit. Это имя не влияет на саму протестированную процедуру. Это только появляется в протоколах испытаний, сгенерированных вашим тестовым скриптом.

Тесты могут быть произвольными операторами MuPAD и операторами prog::test. Однако большая часть функциональности должна быть выполнена в качестве аргумента prog::test. Только инициализация переменных должна быть выполнена за пределами операторов prog::test в тестовом файле, потому что prog::test захватывает каждую ошибку (с функциональным traperror) и распечатывает определенное сообщение об ошибке.

Примечание

Если ошибка происходит за пределами prog::test, чтение тестового файла прервано.

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

Синхронизация информации может быть собрана и выдержала сравнение, которые рассматривают только время оценки первого аргумента stmt prog::test (см. prog::testinit).

Если тест приводит к сбою, например, два первых аргумента вывода prog::test к различным объектам MuPAD, или если запрос улучшения был дан, prog::test распечатывает сообщение. Это сообщение перечисляет следующие данные:

  1. Первая строка запускается со строки Error in test и содержит имя и порядковый номер отдельного теста.

  2. Следующие три строки содержат вход, ожидаемый результат и результат, на самом деле наблюдаемый.

  3. Для каждой из опций Priority, Enhancement, Message, Developers и BugId, если опция была установлена, будет распечатана соответствующая строка. Обратите внимание на то, что Message может быть установлен путем простого обеспечения строки сообщения.

Эта информация сопровождается пустой пустой строкой.

Если только один аргумент дан, аргумент оценен и по сравнению с TRUE, т.е. prog::test(ex) эквивалентен prog::test(ex, TRUE).

Когда тест инициализируется с prog::testinit и заканчивается prog::testexit, короткое сообщение распечатано со следующим форматом:

Info: 20 test, 1 error, runtime factor 1.7 (expected 2.0)

Сообщение содержит количество всех тестов, выполняемых (20), количество ошибок (1), и в два раза факторы: В первый раз фактор на основе фактического времени теста, и фактором второго раза является ожидаемое значение, данное prog::testinit.

Примеры

Пример 1

prog::test может быть назван в интерактивном режиме:

prog::test(1 + 1, 2):
prog::test(is(2 > 1)):
prog::test(sin(PI), 0, "check sin"):

Эти тесты проверяются хорошо. В следующих тестах неправильные результаты тестируются против, чтобы продемонстрировать сообщения, данные prog::test:

prog::test(1 + 2, 2):
Error in test 4
Input: 1 + 2
Expected:  2
Got:       3
Near line: 1
prog::test(is(x > 1)):
Error in test 5
Input: is(1 < x)
Expected:  TRUE
Got:       UNKNOWN
Near line: 1
prog::test(sin(PI), PI, "check sin"):
Error in test 6
Input: sin(PI)
Expected:  PI
Got:       0
Message: check sin
Near line: 1

Пример 2

Тестовый файл должен содержать вызовы prog::testinit и prog::testexit. В следующем файле мы тестируем функцию, определяемую в том же файле, который является довольно редким, очевидно.

// test file "test.tst"
test:= (a, b) -> a^2 + 2*b^2 - a*b:
prog::testinit("test", 0.1):
print(Unquoted, "testname"):
prog::test(test(1, 4), 29, Message = "my first example"):
prog::test(test(3, -2), 24, "the second example"):
prog::test(error("test"), TrapError = 1028):
prog::testexit():

Первый оператор является только комментарием. Вторая строка содержит инициализацию процедуры тестирования под названием test. Затем тест инициализируется с prog::testinit.

После этого три теста выполняются: первый тест является правильным, второй ожидаемый результат является неправильным, и третий тест производит ошибку, но ожидаемый результат является этой ошибкой, кодом ошибки, возвращенным traperror, является 1028 (пользовательский вызов error).

Целый тест не занимает почти времени:

read("test.tst")
Info: memory limit is 256 MB
Error in test 2
Input: test(3, -2)
Expected:  24
Got:       23
Message: the second example
Near line: 4
Info: time used outside of 'prog::test' takes 100%
Info: 3 tests, 1 error, runtime factor  0.0  (expected  0.1)
Info: CPU time:  1.1 s
Info: Memory allocation 9026800 bytes [prog::testexit]

Пример 3

Большинство опций, принятых prog::test, более или менее непосредственно помещается в вывод:

prog::test(1+1, 1, Baseline, Message(2)="well ...",
  Priority=Low, BugId="123-456")
Baseline Error in test 7
Input: 1 + 1
Expected:  1
Got:       2
Priority: Low
Message: well ...
BugId: 123-456
Near line: 2

Пример 4

Чтобы протестировать это, определенный вызов не занимает больше времени, чем конкретное количество секунд, использует опцию Timeout:

prog::test(prog::wait(5.0), null(), Timeout = 2)

Пример 5

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

prog::test(float(PI), 3.1415926535897932385)
Error in test 8
Input: float(PI)
Expected:  3.141592654
Got:       3.141592654
Near line: 1

Проблема здесь состоит в том, что существует много значений с плавающей точкой, которые не идентичны, все же отображены как таковые (если вы не увеличиваете DIGITS достаточно далеко, чтобы видеть различие). Используя опцию Method, можно обеспечить функцию, чтобы сравнить значения:

prog::test(float(PI), 3.1415926535897932385, Method = `~=`)

Пример 6

При реализации символьных алгоритмов часто существует несколько правильных и приемлемых ответов. В некоторых случаях получение любого определенного набора решений прекрасно. В этих случаях, с помощью Method = _in разумный способ записать тесты (_in является функциональной формой оператора in):

prog::test(int(ln(ln(a*x)^(1/2)), x),
  {
    x*ln(ln(a*x)^(1/2)) - Li(a*x)/(2*a),
    x*ln(ln(a*x))/2 - Li(a*x)/(2*a)
  },
  Method = _in,
  Timeout = 20)

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

prog::test((x^2+2*x+1)/(x+1),
  (x^2+2*x+1)/(x+1),
  Enhancement = x+1)
Enhancement request: 11
Input: (x^2 + 2*x + 1)/(x + 1)
Got:       (x^2 + 2*x + 1)/(x + 1)
Requested: x + 1
Near line: 3

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

prog::test(normal((x^2+2*x+1)/(x+1)),
  (x^2+2*x+1)/(x+1),
  Enhancement = x+1)
Enhancement done: 12
Input: normal((x^2 + 2*x + 1)/(x + 1))
Got:       x + 1
Requested: x + 1
Near line: 3

Обратите внимание на то, что тест с запросом улучшения является, прежде всего, все еще обычным тестом и ведет себя как таковой:

prog::test((x^2+x+1)/(x+1),
  (x^2+2*x+1)/(x+1),
  Enhancement = x+1)
Error in test 13
Input: (x^2 + x + 1)/(x + 1)
Expected:  (x^2 + 2*x + 1)/(x + 1)
Got:       (x^2 + x + 1)/(x + 1)
Near line: 3

Параметры

stmt

Оператор MuPAD, чтобы протестировать

res

Выражение MuPAD или оператор, который определяет ожидаемый результат.

message

Сообщение (строка), который отображен, если тест перестал работать – видит опцию Message ниже

Опции

TrapError

Опция, заданная как TrapError = errnr

Ожидайте, что тест выдаст ошибку. errnr должен быть целым числом, ожидаемым от вызова traperror(stmt) или список целого числа и строки, как возвращено getlasterror().

Method

Опция, заданная как Method = comp

Метод раньше сравнивал фактическое и ожидаемый результат. Будет вызван обоими выражениями и должен возвратить TRUE или FALSE.

Timeout

Опция, заданная как Timeout = sec

Тайм-аут для оценки тестов. И фактическое и ожидаемый результат оценены с этим ограничением по времени. Если вычисление занимает слишком много времени, prog::test ведет себя, как будто команда привела к ошибке из-за тайм-аута (код ошибки 1320).

Message

Опция, заданная как Message = message или Message(res1) = message

Добавьте сообщение (строка) к выводу prog::test. Если res1 дан, сообщение дано, если результатом оценки stmt является res1.

Baseline

Отметьте этот тест как переставший работать в своего рода “базовой линии”, чтобы дифференцировать новые ошибки (происхождение от новых разработок кода, отказов регрессии) от ошибок, уже существующих в некоторой определенной более ранней версии. Это влияет на вывод prog::test.

Enhancement

Опция, заданная как Enhancement = res1

Запросите некоторый другой вывод, чем тот, в настоящее время протестированный на. Семантически, вызов формы средние значения prog::test(inp, out, Enhancement = out2) “проверяют, что вызов результаты inp в том же самом как вызов, out, но отмечают, что мы на самом деле предпочли бы видеть out2”.

ExpectedWarnings

Опция, заданная как ExpectedWarnings = list

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

High, Low, Medium, Priority

Опция, заданная как Priority = Low | Medium | High

Обозначьте важность этого теста. Это обычно будет очень субъективным вопросом и влияет на вывод prog::test только, чтобы позволить инструменты, анализирующие вывод, отображающий проблемы более высокого приоритета более заметно.

Developers

Опция, заданная как Developers = devnames

Протестирована строка, включенная в вывод prog::test, обозначая разработчиков, которых считают ответственными за код. Это предназначается для инструментов последующей обработки.

BugId

Опция, заданная как BugId = bugid

Снова, для вывода prog::test, включайте ссылку на некоторую систему отслеживания ошибок. bugid может быть любым объектом MuPAD.

Возвращаемые значения

prog::test возвращает пустой объект null().

Смотрите также

Функции MuPAD