Python / Django : 단위 테스트 결과에 특정 문자열이 포함되어 있다고 주장하는 방법은 무엇입니까?


79

파이썬 단위 테스트 (실제로 Django)에서 assert내 테스트 결과에 내가 선택한 문자열이 포함되어 있는지 알려주 는 올바른 문장 은 무엇 입니까?

self.assertContainsTheString(result, {"car" : ["toyota","honda"]})

result위의 두 번째 인수로 지정한 json 객체 (또는 문자열)가 최소한 포함되어 있는지 확인하고 싶습니다.

{"car" : ["toyota","honda"]}

답변:


66
self.assertContains(result, "abcd")

json과 함께 작동하도록 수정할 수 있습니다.

개체 self.assertContains에만 사용하십시오 HttpResponse. 다른 개체의 경우 self.assertIn.


2
예,하지만 json 구조로 인해 json에서는 문제가되지 않지만 파이썬 문자열과 비교하려는 경우 문제가되는 공백이 추가 될 수 있습니다.
francois 2013-08-13

33
assertContains는 HttpReponse 이외의 다른 객체에 사용되는 것이 아닙니다. 대신 "in"python 키워드와 함께 assertTrue를 사용하는 것을 선호합니다 (아래 내 answser 참조).
Pierre Criulanscy

12
이것은 잘못된 것입니다. Assertconains는 http 응답 용입니다.
kagronick apr

3
이 답변은 HttpResponse 전용으로 맞춤화되었음을 명확히해야합니다.
rtindru

123

문자열이 다른 문자열의 하위 문자열인지 아닌지 확인하려면 assertInassertNotIn다음 을 사용해야합니다 .

# Passes
self.assertIn('bcd', 'abcde')

# AssertionError: 'bcd' unexpectedly found in 'abcde'
self.assertNotIn('bcd', 'abcde')

Python 2.7Python 3.1 이후 새로운 기능입니다.


5
또한 assertIn설명한대로 실패시 유용한 메시지를 제공합니다.
jamesc

22

간단한 assertTrue + in python 키워드를 사용하여 다른 문자열에서 예상되는 문자열 부분에 대한 단언을 작성할 수 있습니다.

self.assertTrue("expected_part_of_string" in my_longer_string)

9
"거짓은 사실이 아니다 않고 AssertionError는"이 전략 문제는 그 형태의 가난한 실패 메시지를 줄 수입니다
jamesc

1
@jamesc가 동의합니다. 테스트에 오류 세부 정보가 표시되어야합니다. assertTrue를 사용하는 경우이 문제에 대한 해결 방법이 있습니까?
Luk Aron

@LukAron assertTrue를 사용해야하는 경우, 더 자세한 정보를 포함하기 위해 미리 빌드 한 메시지를 전달할 수 있습니다. assertTrue (expr, msg = message). 메시지가 복잡해지면 메시지 빌드를 추출하고 assertTrue 검사를 별도의 어설 션 헬퍼로 추출 할 수 있습니다. 별도의 어설 션 헬퍼는 자체 테스트를 통해 예상대로 작동하는지 확인할 수 있습니다.
jamesc

9

.NET을 사용하여 JSON 개체를 빌드합니다 json.dumps().

그런 다음 assertEqual(result, your_json_dict)

import json

expected_dict = {"car":["toyota", "honda"]}
expected_dict_json = json.dumps(expected_dict)

self.assertEqual(result, expected_dict_json)

1
assertTrue()대신 왜 사용 assertEqual()합니까? 최소한을 사용 assertEqual()하면 모듈은 결과와 예상 값을 모두 인쇄합니다.
Denilson Sá Maia

당신 말이 맞습니다. assertEqual ()이 더 좋습니다. 링크를 찾을 수 없지만 assertEqual 대신 assertTrue를 사용하기 위해 어딘가에서 읽었을 것입니다. 분명히 내가 틀렸다 :) 위의 예를 고칠 것입니다.
Vincent Audebert 2014 년

12
dumps()은 임의의 순서를 사용하고에서 키의 순서를 알지 못 하기 때문에 사전에 둘 이상의 키가있는 경우 신뢰할 수 없습니다 result. 을 사용하는 것이 훨씬 낫습니다 self.assertEqual(json.loads(result), expected_dict).
André Caron 2014 년

7

Ed I가 언급했듯이 , assertIn아마도 하나의 문자열을 다른 문자열에서 찾는 가장 간단한 대답 일 것입니다. 그러나 질문은 다음과 같습니다.

result위의 두 번째 인수로 지정한 json 객체 (또는 문자열)가 최소한 포함되어 있는지 확인하고 싶습니다 .{"car" : ["toyota","honda"]}

따라서 실패시 유용한 메시지가 수신되도록 여러 단언을 사용합니다. 테스트는 원래 작성하지 않은 사람이 향후 테스트를 이해하고 유지 관리해야합니다. 따라서 우리가 내부에 있다고 가정합니다 django.test.TestCase.

# Check that `car` is a key in `result`
self.assertIn('car', result)
# Compare the `car` to what's expected (assuming that order matters)
self.assertEqual(result['car'], ['toyota', 'honda'])

다음과 같은 유용한 메시지를 제공합니다.

# If 'car' isn't in the result:
AssertionError: 'car' not found in {'context': ..., 'etc':... }
# If 'car' entry doesn't match:
AssertionError: Lists differ: ['toyota', 'honda'] != ['honda', 'volvo']

First differing element 0:
toyota
honda

- ['toyota', 'honda']
+ ['honda', 'volvo']

-2

나는 비슷한 문제에 처해 있었고 render_content 속성을 사용 했기 때문에

assertTrue('string' in response.rendered_content) 유사하게

assertFalse('string' in response.rendered_content) 문자열이 렌더링되지 않았는지 테스트하려면

하지만 초기에 제안 된 방법도 작동했습니다.

AssertContains(response, 'html string as rendered')

그래서 저는 첫 번째가 더 간단하다고 말하고 싶습니다. 도움이 되길 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.