我是使用Python进行单元测试的新手。我想在我的代码中测试一些函数。特别是我需要测试输出是否具有特定尺寸或相同尺寸。
我的单元测试Python脚本如下所示:
import unittest
from func import *
class myTests(unittest.TestCase):
def setUp(self):
# I am not really sure whats the purpose of this function
def test_main(self):
# check if outputs of the function "main" are not empty:
self.assertTrue(main, msg = 'The main() function provides no return values!')
# check if "run['l_modeloutputs']" and "run['l_modeloutputs']", within the main() function have the same size:
self.assertCountEqual(self, run['l_modeloutputs'], run['l_dataoutputs'], msg=None)
# --> Doesn't work so far!
# check if the dimensions of "props['k_iso']", within the main() function are (80,40,100):
def tearDown(self):
# I am also not sure of the purpose of this function
if _name__ == "__main__":
unittest.main()
以下是测试中的代码:
def main(param_file):
# Load parameter file
run, model, sequences, hydraulics, flowtrans, elements, mg = hu.model_setup(param_file)
# some other code
...
if 'l_modeloutputs' in run:
if hydraulics['flag_gen'] is False:
print('No hydraulic parameters generated. No model outputs saved')
else:
save_models(realdir, realname, mg, run['l_modeloutputs'], flowtrans, props['k_iso'], props['ktensors'])
我需要从run['l_modeloutputs']
访问run['l_dataoutputs']
函数的参数main
和func.py
。如何将这些参数的尺寸传递给单元测试脚本?
答案 0 :(得分:0)
这听起来有点像目前的两件事之一。您的代码目前还没有以易于测试的方式进行布局,或者您可能试图一次性测试或调用太多代码。
如果您的代码布局如下:
main(file_name):
with open(file_name) as file:
... do work ...
results = outcome_of_work
并且您正在尝试测试file_name
中的内容以及results
的大小,然后您可能想要重构这一点,以便您可以测试较小的操作。也许:
main(file_name):
# `get_file_contents` appears to be `hu.model_setup`
# `file_contents` would be `run`
file_contents = get_file_contents(file_name)
results = do_work_on_file_contents(file_contents)
当然,如果您已经有类似的设置,那么以下内容也适用。这可以让您更轻松地进行测试,因为您可以轻松控制进入测试的内容(file_name
或file_contents
),然后可以测试结果(file_contents
或{{ 1}})预期结果。
使用results
模块,您基本上可以为每个测试创建一个小函数:
unittest
然后可以针对不同的潜在输入集重复这一点,包括良好和边缘情况。
它可能值得寻找更深入的教程,因为这显然只是一个非常快速的查看。
只有在您编写的每个测试都要完成某些事情时才需要class Test(TestCase):
def test_get_file_contents(self):
# ... set up example `file-like object` ...
run = hu.model_setup(file_name)
self.assertCountEqual(
run['l_modeloutputs'], run['l_dataoutputs'])
... repeat for other possible files ...
def test_do_work_on_file_contents(self):
example_input = ... setup input ...
example_output = do_work_on_file_contents(example_input)
assert example_output == as_expected
和setUp
(即您已经以特定方式设置了一个对象,对于多个测试,这可以在tearDown
完成并在每个测试函数之前运行。