Suponha que, por qualquer motivo, eu me recuse a usar matlab.unittest.TestCase
. Procuro reproduzir a seguinte funcionalidade do Python:
# `utils.py` is in same directory as the test file
# `test_wide_variable` gets used inside or outside of test functions
from utils import test_wide_variable
# gets used inside of test functions
file_wide_variable = [1, 2, 3]
def test_func1():
y = (file_wide_variable, test_wide_variable)
# ...
# ...
test_func1()
# test_func2()
test_func3()
# ...
Tentar
Defina reset_test_params.m
, com
global P
P = struct;
Então, o arquivo de teste se parece com
reset_test_params
P.file_wide_variable = [1, 2, 3];
P.test_wide_variable = load('test_wide_variables.m').test_wide_variable;
test_func1()
% test_func2()
test_func3()
% ...
function test_func1(~)
global P
y = {P.file_wide_variable, P.test_wide_variable};
% ...
% ...
Pergunta
Alguma desvantagem notável com essa abordagem? Em particular, execução simultânea de arquivos? Com Python, é possível executar vários testes ao mesmo tempo no mesmo namespace global (AFAIK), portanto, uma variável global seria proibida.
Seu script Python, vamos chamá-lo
my_tests.py
,presumivelmente é chamado pelo equipamento de teste com
ou algo semelhante (nem testei esse código).
Seu script MATLAB, vamos chamá-lo
my_tests.m
,quando chamado em um equipamento de teste,
ou equivalente
fará com
P
que seja definido no espaço de trabalho do equipamento de teste (espero que não sobrescreva nenhuma variável local!).test_func()
, no entanto, está perdido. O script em si não o chama, portanto permanece sem uso e indefinido. Por ser uma função local, ela só pode ser chamada de dentro domy_tests.m
.Portanto, tentar replicar diretamente o formato do Python para um script de teste é um fracasso, porque as duas linguagens funcionam de maneira fundamentalmente diferente nesses aspectos.
Observe também que, quando você chama um script de outro script ou função (no MATLAB), todas as suas variáveis serão definidas no espaço de trabalho do chamador. Isso significa que o script pode potencialmente substituir qualquer uma das variáveis do chamador. Usar scripts para construir um software mais complexo é uma péssima ideia, seria um pesadelo tentar manter todas as variáveis do seu script separadas. É exatamente para isso que servem as funções. As funções têm escopo local, facilitando muito a composição.
Eu não usaria scripts para outra coisa senão (talvez) o ponto de entrada do programa. Todo o resto deveria ser uma função. Não há razão para não usar funções.
É assim que eu tentaria reproduzir o formato Python no MATLAB:
test_wide_variable.m
:my_tests.m
:Agora, isso poderia ser chamado a partir de um equipamento de teste da seguinte maneira:
Observe que as variáveis declaradas localmente na função
my_tests()
estão disponíveis para as funções aninhadas definidas nesta função (observe que essas funções são declaradas entre efunction
asend
instruções formy_tests()
e, portanto, são funções aninhadas, não funções locais .A
my_tests()
função retorna uma matriz de células com identificadores para as funções aninhadas. Eles podem então ser chamados pelo equipamento de teste de chamada. Quando chamados, eles ainda têm acesso às variáveis definidas comomy_tests
estavam quando os identificadores de função foram obtidos pela primeira vez - essas são capturas lambda.