AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 77179915
Accepted
OverLordGoldDragon
OverLordGoldDragon
Asked: 2023-09-26 20:13:43 +0800 CST2023-09-26 20:13:43 +0800 CST 2023-09-26 20:13:43 +0800 CST

Teste de unidade com variáveis ​​em todo o arquivo, sem classes

  • 772

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.

matlab
  • 1 1 respostas
  • 47 Views

1 respostas

  • Voted
  1. Best Answer
    Cris Luengo
    2023-09-26T22:39:21+08:002023-09-26T22:39:21+08:00

    Seu script Python, vamos chamá-lo my_tests.py,

    from utils import test_wide_variable
    
    # gets used inside of test functions
    file_wide_variable = [1, 2, 3]
    
    def test_func():
        y = (file_wide_variable, test_wide_variable)
        # ...
    

    presumivelmente é chamado pelo equipamento de teste com

    from inspect import getmembers, isfunction
    
    import my_tests
    for name, func in getmembers(my_tests, isfunction):
       func()
    

    ou algo semelhante (nem testei esse código).

    Seu script MATLAB, vamos chamá-lo my_tests.m,

    reset_test_params
    
    P.file_wide_variable = [1, 2, 3];
    P.test_wide_variable = load('test_wide_variables.m').test_wide_variable;
    
    function test_func(~)
        global P
        y = {P.file_wide_variable, P.test_wide_variable};
        # ...
    

    quando chamado em um equipamento de teste,

    my_tests
    

    ou equivalente

    run("my_tests")
    

    fará com Pque 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 do my_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:

    function v = test_wide_variable
    v = [5, 6, 7];
    

    my_tests.m:

    function funcs = my_tests
       file_wide_variable = [1, 2, 3];
       data = test_wide_variable
    
       funcs = {@test_func};  % list all the test functions defined in the file
    
       function test_func
          y = {file_wide_variable, data};
          % ...
       end
    
    end
    

    Agora, isso poderia ser chamado a partir de um equipamento de teste da seguinte maneira:

    fail = 0
    total = 0
    for func = my_tests
       total = total + 1;
       try
          func()
       catch ME
          disp(ME)
          fail = fail + 1;
       end
    end
    disp(fail + "tests failed out of " + total " tests.")
    

    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 e functionas endinstruções for my_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 como my_testsestavam quando os identificadores de função foram obtidos pela primeira vez - essas são capturas lambda.

    • 1

relate perguntas

  • Resultados indefinidos (NaN) ao usar ode45 no MATLAB 2022

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    destaque o código em HTML usando <font color="#xxx">

    • 2 respostas
  • Marko Smith

    Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}?

    • 1 respostas
  • Marko Smith

    Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)?

    • 2 respostas
  • Marko Smith

    Por que as compreensões de lista criam uma função internamente?

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 respostas
  • Marko Smith

    Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)?

    • 4 respostas
  • Marko Smith

    Por que o construtor de uma variável global não é chamado em uma biblioteca?

    • 1 respostas
  • Marko Smith

    Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto?

    • 1 respostas
  • Marko Smith

    Somente operações bit a bit para std::byte em C++ 17?

    • 1 respostas
  • Martin Hope
    fbrereto Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi Por que as compreensões de lista criam uma função internamente? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A formato fmt %H:%M:%S sem decimais 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python std::views::filter do C++20 não filtrando a visualização corretamente 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa Por que o construtor de uma variável global não é chamado em uma biblioteca? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev Por que os compiladores perdem a vetorização aqui? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan Somente operações bit a bit para std::byte em C++ 17? 2023-08-17 17:13:58 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve