Я относительно новичок в Python и действительно плохо знаком с pytest
.В любом случае, я пытаюсь написать несколько тестов для разбора твитов в json с разграничением строк.Вот упрощенный пример test_cases.jsonl
:
{"contributors":null,"coordinates":null,"created_at":"Sat Aug 20 01:00:12 +0000 2016","entities":{"hashtags":[{"indices":[97,116],"text":"StandWithLouisiana"}]}}
{"contributors":null,"coordinates":null,"created_at":"Sat Aug 20 01:01:35 +0000 2016","entities":{"hashtags":[]}}
Я хотел бы протестировать функцию, подобную следующей:
def hashtags(t):
return ' '.join([h['text'] for h in t['entities']['hashtags']])
Я могу проверить одну строку JSON какследует:
@pytest.fixture
def tweet(file='test_cases.jsonl'):
with open(file, encoding='utf-8') as lines:
for line in lines:
return json.loads(line)
def test_hashtag(tweet):
assert hashtags(tweet) == 'StandWithLouisiana'
(я просто даю имя файла в качестве аргумента для функции для этого примера)
Это работает в том смысле, что тест проходит, потому что первая строка проходиттест, но то, что я в основном пытаюсь сделать, это что-то вроде этого, и я не ожидаю, что это будет работать, как написано.
def test_hashtag(tweet):
assert hashtags(tweet) == 'StandWithLouisiana' # first tweet
assert hashtags(tweet) == '' # second tweet
Эта ошибка не выполняется, поскольку она проверяет, является ли первый твит (строка в json) пустым, а не второй.Я предполагаю, что это из-за return
в приборе, но если я пытаюсь yield
вместо return
, я получаю ошибку yield_fixture function has more than one 'yield'
(и вторая строка все еще не работает).
То, что я сейчас делаю, чтобы обойти эту проблему - сделать каждую строку отдельным файлом JSON, а затем создать отдельное приспособление для каждого из них.(Для более коротких примеров я использую StringIO
для записи встроенного JSON).Это работает, но чувствует себя не изящным.У меня есть ощущение, что я должен использовать @pytest.mark.parametrize
для этого, но я не могу обойти это.Я думаю, что я также попытался pytest_generate_tests
, чтобы сделать это, но это будет проверять каждый ключ.Можно ли делать то, о чем я думаю, или лучше создавать отдельные приборы, когда у меня разные значения для утверждений?