从函数中访问变量和列表

时间:2018-02-17 15:23:49

标签: python python-3.x unit-testing

我是使用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']函数的参数mainfunc.py。如何将这些参数的尺寸传递给单元测试脚本?

1 个答案:

答案 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_namefile_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完成并在每个测试函数之前运行。