在 python 中为以下算法编写单元测试用例

write unit test case in python for below algorithm

我已经编写了代码,但不明白如何在 python 中为下面的程序编写测试用例。有人可以提供示例测试用例吗?

提前致谢。我尝试了一些示例,但我不明白应该测试代码的哪些部分,因为它只选择与最高价格相关的公司名称。

with open('/home/company_data.csv') as f:
    reader = csv.reader(f)
    tup = namedtuple('tup', ['price','year', 'month'])
    d = OrderedDict()
    names = next(reader)[2:]
    for name in names:
     d[name] = tup(0,'year', 'month')
    for row in reader:
        year, month = row[:2]        
        for name, price in zip(names, map(int, row[2:])):    
           if d[name].price < price:     
               d[name] = tup(price, year, month)

这样的代码很难测试,因为没有输出,但是您可以通过向它提供样本数据集并检查它选择的公司与公司的对比来测试它是否选择了正确的公司您已经知道价格最高(您可能需要更改代码以使其更动态地选择数据)

您应该使您的代码尽可能通用。就像在这种情况下稍微改变它以便它可以处理任何文件名。类似于:

def foo(filename):
  with open(filename) as f:
    reader = csv.reader(f)
    tup = namedtuple('tup', ['price','year', 'month'])
    d = OrderedDict()
    names = next(reader)[2:]
    for name in names:
     d[name] = tup(0,'year', 'month')
    for row in reader:
        year, month = row[:2]        
        for name, price in zip(names, map(int, row[2:])):    
           if d[name].price < price:     
               d[name] = tup(price, year, month)
    return d

然后用这样的东西测试:

if __name__ == "__main__": #run if standalone
    results = foo('test.csv')
    assert (results == expectedResults)

其中 expectedResults 包含您期望的结果。 “==”可能无法准确工作,但可以进行某种相等性测试。如果您使用断言 and/or 独立检查,您可以将代码留在测试中。

测试用例证明你的功能的正确性。你如何测试正确性?按"proving"吧。因此,您使用预定义的输出针对您的函数编写测试用例,以便您可以验证它 returns 预期的结果。

示例:使用 python 的 unittest 模块,您可以为将两个数字相加的函数编写测试,如下所示:

import unittest

def my_adding_function(x,y):
    return x+y

class TestMyFunction(unittest.TestCase):
    def setUp(self):
        pass

    def test_my_function(self):
        self.assertEqual(my_adding_function(3,4), 7)

if __name__ == '__main__':
    unittest.main()

你在这里做的是说当我在 3 和 4 上调用 my_adding_function 时,我应该得到 7。如果你的函数正确,测试将通过 - 如果不正确则失败。

对于您的情况,如果您想从示例 csv 中选择价格最高的公司名称,可以这样做:

import unittest

def get_highest_valued_company(input_csv):
    process[...]
    return 'highest company name'

class TestMyFunction(unittest.TestCase):
    def setUp(self):
        pass

    def test_my_csv_function(self):
        self.assertTrue(get_highest_valued_company(csv)=='name_here')

if __name__ == '__main__':
    unittest.main()