Python单元测试:设计模拟输入的目录结构?

时间:2014-12-16 00:00:30

标签: python unit-testing

我正在编写解析大文件的生产代码,该文件本身包含许多不同的案例。为了对生产代码进行单元测试,我想为每个案例编写一个测试用例。我的问题是设置测试目录和测试代码的好方法。

目前的目录结构是:

root/
    src/
        parser.py
    test/
        test_parser.py
        raw/
            case_1.csv
            case_2.csv
            ...

测试代码如下所示:

from parser import parse
import unittest import TestCase


class Test_Parser(TestCase):

   def setUp(self):
       raw_dir = 'raw'

   def test_case_1(self):
       filename = self.raw_dir + '/case_1.csv'
       actual = parse(filename)
       # assert actual == expected

   def test_case_2(self):
       filename = self.raw_dir + '/case_2.csv'
       actual = parser(filename)
       # assert actual == expected

   ...

是否有更多的Pythonic方法可以将目录self.raw_dir排除在外,这样测试用例更干净,只需编写filename = 'case_1.csv'

1 个答案:

答案 0 :(得分:1)

如果你想避免在测试方法中编写整个路径,这是可以理解的,你可以在一个不以_test开头的单独方法中隔离它,因此在执行时不会被调用测试:

import os
import parser
import unittest

class TestParser(unittest.TestCase):

    def setUp(self):
        self.raw_dir = "raw"

    def get_path(self, filename):
        path = os.path.join(self.raw_dir, filename)
        return path

    def file_parse(self, filename):
        # every method of this class being supposed to call
        # the parser, it makes sense to isolate these calls
        # into a specific method to avoid repetition
        # - won't be the same is the class is more general-purpose
        path = self.get_path(filename)
        actual = parser.parse(path)
        return actual

    def test_case_1(self):
        actual = self.file_parse(filename='case_1.csv')
        # assert actual == expected

    def test_case_2(self):
        actual = self.file_parse(filename='case_2.csv')
        # assert actual == expected

这里的主要想法是关注点分离。一种特定的方法来处理“将dirs和文件名放入正确的路径”劳动,另一种方法是进行解析和测试方法来进行实际测试(仅限于此)。

请注意,根据建议,您应使用os.path.joindocumentation),而不是使用/字符串进行硬编码。

此外,根据PEP8class names should be CamelCase,而不是under_scoreA_Mix_Of_Both