假设,无论出于何种原因,我拒绝使用matlab.unittest.TestCase
. 我试图重现以下 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()
# ...
试图
定义reset_test_params.m
, 与
global P
P = struct;
然后,测试文件看起来像
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};
% ...
% ...
问题
这种方法有什么明显的缺点吗?特别是并发文件执行?使用Python,我们可以在同一个全局命名空间(AFAIK)中同时运行多个测试,因此全局变量是一个禁忌。
你的 Python 脚本,我们称之为
my_tests.py
,大概被测试工具调用
或类似的东西(我什至没有测试过这段代码)。
您的 MATLAB 脚本,我们称之为
my_tests.m
,当在测试工具中调用时,
或同等地
将导致
P
在测试工具的工作区中定义(希望不会覆盖任何局部变量!)。test_func()
然而,丢失了。脚本本身不调用它,因此它保持未使用和未定义状态。作为本地函数,它只能从内部调用my_tests.m
。因此,尝试直接复制 Python 的测试脚本格式是行不通的,因为这两种语言在这些方面的工作方式根本不同。
另请注意,当您从另一个脚本或函数(在 MATLAB 中)调用脚本时,其所有变量都将在调用者的工作区中定义。这意味着脚本可能会覆盖调用者的任何变量。使用脚本构建更复杂的软件是一个非常糟糕的主意,试图将所有脚本的变量分开将是一场噩梦。这正是函数的用途。函数具有局部作用域,使组合变得更加容易。
除了(也许)程序的入口点之外,我不会将脚本用于任何其他用途。其他一切都应该是一个函数。没有理由不使用函数。
这就是我尝试在 MATLAB 中重现 Python 格式的方法:
test_wide_variable.m
:my_tests.m
:现在可以从测试工具中调用它,如下所示:
请注意,函数中本地声明的变量
my_tests()
可用于此函数中定义的嵌套函数(请注意,这些函数是在function
和end
语句之间声明的my_tests()
,因此它们是嵌套函数,而不是本地函数。该
my_tests()
函数返回一个元胞数组,其中包含嵌套函数的句柄。然后可以通过调用测试工具来调用它们。my_tests
调用时,它们仍然可以访问首次获取函数句柄时定义的变量——这些是 lambda 捕获。