Этот пример показывает, как записать модульный тест на несколько свойств осей вращения MATLAB® с помощью новых фиксаторов и фиксаторов файла.
Создайте файл, содержащий основную функцию, которая тестирует свойства осей вращения, и включайте две тестовых функции. Одна функция проверяет, что пределы оси X правильны, и другой проверяет, что цвет поверхности поверхности правилен.
В папке на вашем пути MATLAB создайте axesPropertiesTest.m
. В основной функции этого файла имейте functiontests
, создают массив тестов от каждой локальной функции в axesPropertiesTest.m
с вызовом функции localfunctions
.
% Copyright 2015 The MathWorks, Inc. function tests = axesPropertiesTest tests = functiontests(localfunctions); end
Функции фиксатора файла являются настройкой и кодом отключения, который запускает одно время в вашем тестовом файле. Эти фиксаторы совместно используются через тестовый файл. В этом примере функции фиксатора файла создают временную папку и устанавливают его как текущую рабочую папку. Они также создают и сохраняют новую фигуру для тестирования. После того, как тесты завершены, среда восстанавливает исходную рабочую папку и удаляет временную папку и сохраненную фигуру.
В этом примере функция помощника создает простую фигуру — красный цилиндр. В более реалистическом сценарии этот код является частью продукта под тестом и является в вычислительном отношении дорогим, таким образом мотивируя намерение создать фигуру только однажды и загрузить независимые копии результата для каждой тестовой функции. В данном примере однако вы хотите создать эту функцию помощника как локальную функцию к axesPropertiesTest
. Обратите внимание на то, что тестовый массив не включает функцию, потому что ее имя не запускается или заканчивается 'тестом'.
Запишите функцию помощника, которая создает простой красный цилиндр, и добавьте его как локальную функцию к axesPropertiesTest
.
% Copyright 2015 The MathWorks, Inc. function f = createFigure f = figure; ax = axes('Parent', f); cylinder(ax,10) h = findobj(ax,'Type','surface'); h.FaceColor = [1 0 0]; end
Необходимо назвать настройку и функции отключения испытательного стенда файла setupOnce
и teardownOnce
, соответственно. Эти функции берут один входной параметр, testCase
, в который среда тестирования автоматически передает функциональный объект теста. Этот объект теста содержит структуру TestData
, которая позволяет данным передавать между настройкой, тестом и функциями отключения. В этом примере структура TestData
использует присвоенные поля, чтобы сохранить исходный путь, временное имя папки и имя файла фигуры.
Создайте настройку и функции отключения как локальные функции к axesPropertiesTest
.
% Copyright 2015 The MathWorks, Inc. function setupOnce(testCase) % create and change to temporary folder testCase.TestData.origPath = pwd; testCase.TestData.tmpFolder = ['tmpFolder' datestr(now,30)]; mkdir(testCase.TestData.tmpFolder) cd(testCase.TestData.tmpFolder) % create and save a figure testCase.TestData.figName = 'tmpFig.fig'; aFig = createFigure; saveas(aFig,testCase.TestData.figName,'fig') close(aFig) end function teardownOnce(testCase) delete(testCase.TestData.figName) cd(testCase.TestData.origPath) rmdir(testCase.TestData.tmpFolder) end
Новые фиксаторы являются настройкой функционального уровня и кодом отключения, который запускается до и после каждой тестовой функции в вашем файле. В этом примере функции открывают сохраненную фигуру и находят указатели. После тестирования среда закрывает фигуру.
Необходимо назвать новые функции фиксатора setup
и teardown
, соответственно. Подобно функциям фиксатора файла эти функции берут один входной параметр, testCase
. В этом примере эти функции создают новое поле в структуре TestData
, которая включает указатели на фигуру и на оси. Это позволяет информации передавать между настройкой, тестом и функциями отключения.
Создайте настройку и функции отключения как локальные функции к axesPropertiesTest
. Откройте сохраненную фигуру для каждого теста, чтобы гарантировать тестовую независимость.
% Copyright 2015 The MathWorks, Inc. function setup(testCase) testCase.TestData.Figure = openfig(testCase.TestData.figName); testCase.TestData.Axes = findobj(testCase.TestData.Figure,... 'Type','Axes'); end function teardown(testCase) close(testCase.TestData.Figure) end
В дополнение к пользовательской настройке и коду отключения, Среда Модульного тестирования обеспечивает некоторые классы для создания фиксаторов. Для получения дополнительной информации смотрите matlab.unittest.fixtures
.
Каждый тест является локальной функцией, которая следует соглашению о присвоении имен наличия 'теста' вначале или конца имени функции. Тестовый массив не включает локальные функции, которые не следуют этому соглашению. Подобно настройке и функциям отключения, отдельные тестовые функции должны принять один входной параметр, testCase
. Используйте этот объект теста для верификаций, утверждений, предположений и функций критических утверждений.
Тест функции testDefaultXLim
проверяет, что пределы оси X являются достаточно большими, чтобы отобразить цилиндр. Нижний предел должен быть меньше, чем -10
, и верхний предел должен быть больше, чем 10
. Эти значения прибывают от фигуры, сгенерированной в функции помощника — цилиндр с модульным радиусом 10
, сосредоточенным на источнике. Эта тестовая функция открывает фигуру, созданную и сохраненную в функции setupOnce
, запрашивает предел осей и проверяет, что пределы правильны. Функции проверки, verifyLessThanOrEqual
и verifyGreaterThanOrEqual
, берут тест, фактическое значение, ожидаемое значение и дополнительную диагностическую информацию, чтобы отобразиться в случае отказа как входные параметры.
Создайте функцию testDefaultXLim
как локальную функцию к axesPropertiesTest
.
% Copyright 2015 The MathWorks, Inc. function testDefaultXLim(testCase) xlim = testCase.TestData.Axes.XLim; verifyLessThanOrEqual(testCase, xlim(1), -10,... 'Minimum x-limit was not small enough') verifyGreaterThanOrEqual(testCase, xlim(2), 10,... 'Maximum x-limit was not big enough') end
Функция surfaceColorTest
получает доступ к фигуре, которую вы создали и сохраненный в функции setupOnce
. surfaceColorTest
запрашивает цвет поверхности цилиндра и проверяет, что это красно. Красный цвет имеет значение RGB [1 0 0]
. Функция проверки, verifyEqual
, берет в качестве входных параметров тест, фактическое значение, ожидаемое значение и дополнительную диагностическую информацию, чтобы отобразиться в случае отказа. Обычно при использовании verifyEqual
на значениях с плавающей точкой, вы задаете допуск к сравнению. Для получения дополнительной информации смотрите matlab.unittest.constraints
.
Создайте функцию surfaceColorTest
как локальную функцию к axesPropertiesTest
.
% Copyright 2015 The MathWorks, Inc. function surfaceColorTest(testCase) h = findobj(testCase.TestData.Axes,'Type','surface'); co = h.FaceColor; verifyEqual(testCase, co, [1 0 0],'FaceColor is incorrect') end
Теперь файл axesPropertiesTest.m
вместе с основной функцией, функциями фиксатора файла, новыми функциями фиксатора и двумя локальными тестовыми функциями. Вы готовы запустить тесты.
Следующий шаг должен запустить тесты с помощью функции runtests
. В этом примере вызов runtests
приводит к следующим шагам:
Основная функция создает тестовый массив.
Фиксатор файла записывает рабочую папку, создает временную папку, устанавливает временную папку как рабочую папку, затем генерирует и сохраняет фигуру.
Новая настройка фиксатора открывает сохраненную фигуру и находит указатели.
Тест testDefaultXLim
запущен.
Новое отключение фиксатора закрывает фигуру.
Новая настройка фиксатора открывает сохраненную фигуру и находит указатели.
Тест surfaceColorTest
запущен.
Новое отключение фиксатора закрывает фигуру.
Отключение фиксатора файла удаляет сохраненную фигуру, возвращается к исходному пути и удаляет временную папку.
В командной строке сгенерируйте и запустите тестовый набор.
results = runtests('axesPropertiesTest.m')
Running axesPropertiesTest .. Done axesPropertiesTest __________ results = 1x2 TestResult array with properties: Name Passed Failed Incomplete Duration Details Totals: 2 Passed, 0 Failed, 0 Incomplete. 1.6302 seconds testing time.
К функциональности доступа, доступной таблицам, создайте один из объекта TestResult
.
rt = table(results)
rt = 2x6 table Name Passed Failed Incomplete Duration Details _____________________________________ ______ ______ __________ ________ ____________ 'axesPropertiesTest/testDefaultXLim' true false false 1.0126 [1x1 struct] 'axesPropertiesTest/surfaceColorTest' true false false 0.6176 [1x1 struct]
Экспортируйте результаты испытаний в электронную таблицу Excel®.
writetable(rt,'myTestResults.xls')
Сортировка результатов испытаний путем увеличения длительности.
sortrows(rt,'Duration')
ans = 2x6 table Name Passed Failed Incomplete Duration Details _____________________________________ ______ ______ __________ ________ ____________ 'axesPropertiesTest/surfaceColorTest' true false false 0.6176 [1x1 struct] 'axesPropertiesTest/testDefaultXLim' true false false 1.0126 [1x1 struct]
matlab.unittest.constraints
| matlab.unittest.fixtures