unit-testing matlab continuous-integration simulink stateflow

unit testing - Pruebas unitarias/integración continua con Simulink/Stateflow



unit-testing matlab (8)

Como Craig mencionó, existe un marco en MATLAB introducido en R2013a. Además, este marco agregó un TAPPlugin en R2014a que genera el Test Anything Protocal . Usando ese protocolo puede configurar su construcción de CI con un TAPPlugin (por ejemplo, Jenkins , TeamCity ) para que el sistema de IC pueda fallar la compilación si las pruebas fallan.

Su compilación CI puede parecerse a un comando de shell para iniciar MATLAB y ejecutar todas sus pruebas:

/your/path/to/matlab/bin/matlab -nosplash -nodisplay -nodesktop -r "runAllMyTests"

Luego, runAllMyTests crea el paquete para ejecutarlo y lo ejecuta con el resultado del tap redirigido a un archivo. Tendrá que modificar detalles aquí, pero quizás esto pueda ayudarlo a comenzar:

function runAllMyTests import matlab.unittest.TestSuite; import matlab.unittest.TestRunner; import matlab.unittest.plugins.TAPPlugin; import matlab.unittest.plugins.ToFile; try % Create the suite and runner suite = TestSuite.fromPackage(''packageThatContainsTests'', ''IncludingSubpackages'', true); runner = TestRunner.withTextOutput; % Add the TAPPlugin directed to a file in the Jenkins workspace tapFile = fullfile(getenv(''WORKSPACE''), ''testResults.tap''); runner.addPlugin(TAPPlugin.producingOriginalFormat(ToFile(tapFile))); runner.run(suite); catch e; disp(e.getReport); exit(1); end; exit force;

EDIT: utilicé este tema como las two first publicaciones de un nuevo blog orientado al desarrollador lanzado este año

¿Cómo puedo realizar pruebas unitarias en Simulink o, preferiblemente, Stateflow?

Soy un fanático de los métodos ágiles de software, incluido el desarrollo basado en pruebas. Soy responsable del desarrollo del software de control crítico de seguridad y utilizamos Matlab / Simulink / Stateflow para su desarrollo. Este conjunto de herramientas se selecciona debido al vínculo con los modelos de planta (hardware). (modelo en el bucle, hardware en el bucle)

He encontrado algunos enlaces en Stackoverflow: Marco de pruebas unitarias para MATLAB : xunit , slunit y doctest .

  • ¿Alguien tiene experiencia en el uso de esos o diferentes marcos de pruebas de unidades?
  • ¿Cómo vincular esto con los sistemas de integración continua (es decir, Hudson)?


Creo que estás buscando algo como EZTEST . Está destinado a su propósito especial: desarrollo impulsado por prueba para Simulink y Stateflow a nivel de unidad. Para el software de seguridad crítica, también se incluye un Manual de seguridad, que describe lo que está cubierto con respecto a ISO 26262.

Editar : soy un desarrollador de este software, por lo que mi opinión puede ser parcial. Pero no estoy involucrado en la comercialización o venta del producto. Solo estoy publicando esto, porque sé que existen marcos de prueba de unidad pequeños o ninguno, que satisfacen las necesidades del interrogador (como pueden suponer las respuestas).

También se admiten unidades de prueba que usan SIL y PIL. Lamentablemente, no estoy familiarizado con Hudson, por lo que no puedo abordar esta parte de la pregunta.


He visto diferentes soluciones al problema de la unidad de prueba de modelos de Simulink. Simulink Verification & Validation que no era compatible con los conceptos de xUnit de corredores de prueba y suites de prueba en el momento del examen, TPT sobrecargado con funcionalidad, no es fácil de usar y es muy difícil en términos de capacidad de cambio y mantenimiento.

Además, he visto soluciones personalizadas con scripts de Matlab y tablas de Excel que son livianas pero también difíciles en términos de comprensibilidad y facilidad de mantenimiento. Todavía no recomendaría usar ninguno de estos enfoques, al menos no para las pruebas unitarias.

Al final, terminamos usando un marco de prueba de unidad C ( CUnit ) probando el código generado. Aunque esto definitivamente tiene la desventaja de que debe generar código antes de la prueba, también tiene muchas ventajas, como la fácil integración en sistemas CI, alta flexibilidad de pruebas de unidades de escritura, ejecución rápida de pruebas unitarias y capacidades de refactorización duraderas pero no menos importantes . términos de cambio de Simulink a otro entorno basado en modelos o a código escrito a mano. Especialmente el último punto no debe subestimarse ya que he visto muchos modelos de Simulink que deberían haber sido escritos a mano en primer lugar. Hoy en día, recomendaría usar GoogleTest lugar de CUnit .


Matlab (desde 2013b) tiene soporte integrado para xUnit, en forma de Unity Testing Framework . No lo he usado, pero dado que es posible ejecutar simulink desde Matlab con sim() , este marco se puede usar para probar tus modelos simulink. Sus bibliotecas y posiblemente modelos necesitarán un contenedor para ejecutarlo tal como lo han notado los otros contestadores.

Hay muchos ejemplos en el sitio de Mathworks, lamentablemente ninguno de ellos ejecuta modelos simulink. Codificaría un ejemplo para ti, pero no tengo ML2013b :-(

Para iniciar tus pruebas desde un CI (yo uso Jenkins), puedes llamar a matlab para ejecutar un archivo .m que ejecute tu banco de pruebas, este ejemplo de script cmd llamará Run_Tests.m desde Matlab:

IF EXIST "C:/Program Files (x86)/MATLAB/R2013b/bin/win32/matlab.exe" ( REM WinXP "C:/Program Files (x86)/MATLAB/R2013b/bin/win32/matlab.exe" -r "Run_Tests;exit" -logfile matlab.log ) ELSE ( REM Win7 "C:/Program Files/MATLAB/R2013b/bin/win32/matlab.exe" -r "Run_Tests;exit" -logfile matlab.log )

Tenga en cuenta que si startup.m exists in the directory that you call Matlab from, then it''ll be executed automatically before un startup.m exists in the directory that you call Matlab from, then it''ll be executed automatically before Run_Tests.m`.


Pruebas unitarias Simulink no es sencillo, desafortunadamente. Mathworks tiene SystemTest . Alternativamente, puede desarrollar su propio marco de prueba de Simulink, que es el enfoque que hemos seguido y que no es demasiado difícil, pero es posible que necesite construir arnés de prueba mediante programación.

Para integrarse con CI, necesita crear una función / script que ejecute todas las pruebas, luego puede usar los parámetros de la línea de comandos para que MATLAB.exe ejecute una secuencia de comandos al inicio. Sin embargo, no estoy seguro de que alguien tenga una buena forma de integrar los informes de prueba con el software de CI. Solo mire la cantidad de comentarios en el xunit .


R2016b introduce la integración entre Simulink Test y MATLAB Unit Testing framework . Las pruebas creadas con Simulink Test utilizando Test Manager (* .mldatx) son reconocidas por y pueden ejecutarse de forma nativa utilizando MATLAB Unit Test Runner y así generar resultados de pruebas XML de estilo JUnit o resultados de pruebas TAP que faciliten flujos de trabajo de integración continua.

Consulte esta referencia para obtener más información: https://www.mathworks.com/help/sltest/ug/run-test-files-using-matlab-unit-test.html?s_tid=gn_loc_drop

La documentación muestra un ejemplo de producción de resultados de TAP utilizando matlab.unittest.plugins.TAPPlugin pero puede usar XMLPlugin ( https://www.mathworks.com/help/matlab/ref/matlab.unittest.plugins.xmlplugin-class.html ) en su lugar con la misma facilidad.

Esto debería abrir una mejor integración dentro del entorno de MATLAB, incluso sin CI en la imagen, con la capacidad de tener pruebas MATLAB y Simulink juntas en el mismo conjunto de pruebas y hacer que se ejecuten juntas sin problemas. Por ejemplo, si tiene un directorio MYDIR con pruebas nativas de la unidad MATLAB y Simulink Tests, puede hacer algo tan simple como lo siguiente para ejecutar ambos tipos de pruebas en una sola toma:

resultados = pruebas de ejecución (MYDIR)


Si su sistema es complejo, debe descomponerlo usando la Referencia del modelo y probar cada uno de estos de forma independiente.

Otra solución (más "vieja escuela") es colocar los bloques principales en una biblioteca y crear modelos pequeños.

Para probar estos submodelos y especialmente aquellos con una máquina de estado (Stateflow), lo mejor es crear casos de prueba temporales con el bloque de Signal builder . Tiene un potente signalbuilder de signalbuilder función para interactuar con este bloque y cargar casos de prueba. Mi método es obtener para cada caso de cada submodelo un archivo de entrada y un archivo de salida. Sus salidas del modelo son la salida "correcta" y la salida de los bloques. El modelo se ejecuta con sim (sin entradas externas) y las 2 salidas se comparan con un guión, la señal indicada es diferente (y cuándo).

Puede usar un sistema existente pero prefiero usar el mío para ejecutar cada caso (o algunos de ellos).

No tengo ningún código público para eso, pero esa es la forma en que uso. No uso un CIS, así que no puedo responder la segunda parte de tu pregunta.