Остановить unittest от запуска кода из модуля импорта - PullRequest
0 голосов
/ 10 ноября 2018

Получил 2 файла:

new_project
├── Main.py
└── testing.py

Я бегу:

$ cd new_project
$ python -m unittest testing.py

Весь мой тестовый файл:

import unittest
from Main import Square


class TestSquare(unittest.TestCase):

    def test_init(self):
        self.assertEqual(Square(0,0).center, Point(50,50))
        print("test")

С Square в качестве первого класса в моем файле Main.py. Main.py составлен как показано ниже:

import sys
import math
import random


def d_print(message):
    print(message, file=sys.stderr)


class Square:
    # on découpe le terrain en square et on les marque avec top right corner of square
    def __init__(self, x, y):
        self.xtr = x
        self.ytr = y
        self.size = 100
        self.explored = False
        self.center = Point(x+50, y+50)

while True:
    # do stuff every turn
    x, y, value = [int(j) for j in input().split()]

Код внутри цикла while будет вызываться каждый ход игровым симулятором. Симулятор предоставляет входные данные.

Когда я запускаю командную строку unittest, фактически ожидает ввода

Если я удаляю импортируемые Main и TestFixture на Square, тестирование модуля проходит. Я попробовал несколько конфигураций, и мне не удалось импортировать Square для теста без запуска цикла while.

Поэтому, когда я импортирую только класс из Main.py, он все равно запускает код вне класса. Это ошеломляет мой разум. Вот ссылка на механизм импорта, и я не понимаю, почему он запускает код и как его предотвратить https://docs.python.org/3/reference/import.html

Так как игровая симуляция не находится под моим контролем, я не могу сильно изменить способ написания Main.py Моя единственная идея - разделить цикл и классы на два файла для разработки и тестирования; при отправке мне пришлось бы объединить файлы обратно в один.

Итак (спасибо за чтение;):

  • почему unittest / import работает таким образом?
  • есть идеи, как это решить? (Я сейчас пробую идею разбить файлы, сообщу)

1 Ответ

0 голосов
/ 10 ноября 2018

Чтобы избежать запуска цикла, когда файл импортируется как модуль, запишите его так:

if __name__ == "__main__":
    while True:
        # do stuff every turn
        x, y, value = [int(j) for j in input().split()]

Ответ прост, когда вы импортируете модуль, код в этом файле будет выполнен, что приведет к запуску цикла и блокировке выполнения на input(). Для получения более подробной информации о том, как это работает, прочитайте этот ответ с подробным объяснением

...