Python unittest - предупреждение об установке: ResourceWarning - PullRequest
0 голосов
/ 14 мая 2018

Я готовлю свои тесты, и у меня появляется одно предупреждение после запуска этого сценария:

class TestForm(unittest.TestCase):


    def setUp(self):
        with open('test_json.json') as f:
            self.hd = json.load(f)

        self.reader = csv.reader(open('test.csv'))
        self.result = {}
        for row in self.reader:
            key = row[0]
            self.result[key] = row[1:]

    def test_1(self):
        self.form = self.hd[0]['Customer'][0]['Information'][0]['Form']
        self.exp = self.result['Form1'][0]
        self.assertEqual(self.form, self.exp)

    def test_2(self):
        self.form = self.hd[1]['Customer'][0]['Information'][0]['Form']
        self.exp = self.result['Form2'][0]
        self.assertEqual(self.form, self.exp)

Ошибка:

.C:\Program Files\Python\3.5.1\lib\unittest\suite.py:107: ResourceWarning: unclosed file <_io.TextIOWrapper name='test.csv' mode='r' encoding='cp1250'>
  for index, test in enumerate(self):

Сценарий завершен, но эта ошибка странная.Я заметил, что это происходит только тогда, когда эта часть находится в функции setUp:

        with open('test_json.json') as f:
            self.hd = json.load(f)

        self.reader = csv.reader(open('test.csv'))
        self.result = {}
        for row in self.reader:
            key = row[0]
            self.result[key] = row[1:]

Когда я использую ее за пределами TestForm, в сценарии нет предупреждения.Должен ли я переместить его обратно за пределы class TestForm или даже сделать это в другом файле?

1 Ответ

0 голосов
/ 14 мая 2018

Этот код открывает файл CSV и сохраняет его открытым навсегда:

self.reader = csv.reader(open('test.csv'))

Это «правильный» способ сделать это:

with open('test.csv') as csv_file:
    self.reader = csv.reader(csv_file)
    # use the file

# the file is closed here, when the context is closed

Другой способ - открыть изакрыть "вручную":

csv_file = open('test.csv')
self.reader = csv.reader(csv_file)
# use the file

# when you are done, close the file:
csv_file.close()

Похоже, вы никогда не используете self.reader после setUp, так что это, кажется, лучшее решение в вашем случае:

def setUp(self):
    with open('test.csv') as csv_file:
        reader = csv.reader(csv_file)
        self.result = {}
        for row in reader:
            key = row[0]
            self.result[key] = row[1:]

    # csv_file closes here; reader is not any longer available either
...