2010-03-08 3 views
28

왜 많은 수의 assertEquals() 또는 유사한 함수가 첫 번째 매개 변수로 예상 값을 취하고 실제 값을 두 번째 매개 변수로 사용합니까?
이것은 나에게 반 직관적 인 것처럼 보입니다. 그렇기 때문에이 비정상적인 주문에 대한 특별한 이유가 있습니까?assertEquals() 매개 변수가 순서 (예상, 실제)에있는 이유는 무엇입니까?

+1

이것은, (예상)) 읽는 것이 훨씬 쉬워졌습니다. – JonathanC

+0

정말 순서입니까? 문서는 https://docs.python.org/2/library/unittest.html#unittest.TestCase.assertEqual 자체의 assertEqual에 대한 표준을 나타내지 않으며 해당 페이지를 탐색 할 때 unittest 모듈 자체 내에서 순서가 일치하지 않는다는 것을 보여줍니다 . 그러나이 파이썬 문제는 (실제로, 예상 된) 실제 표준이라고 생각합니다. http://bugs.python.org/issue10573 –

+0

또한 assertEquals는 더 이상 사용되지 않습니다 (적어도 assertEqual을 사용하십시오. 그들은에서 갔어요 같이 보인다 ': 2.7, 실제로 예상과 실제입니다) –

답변

19

작성자가 직감과 일치 할 확률이 50 %이기 때문에.

당신이 알고있는 일부 다른 오버로드

assertWhatever(explanation, expected, actual) 

그리고 설명,의, 실제 반대로 당신이하지 않는, 알고있는 인 기대와 함께 이동하기 때문에 당신이 코드를 작성하는 시점을 안다.

+9

그러나이 경우 대부분의 언어에서는 필수 매개 변수가 먼저 나타나고 필수 매개 변수는 마지막에 표시되기 때문에 약간 일치하지 않게됩니다. 이것이 내가 자연스럽게가는 이유입니다. assertWhatever (실제, 예상 [, 설명]) – jor

+5

죄송합니다. _optional_이 (가) 필수 항목이 아닌 마지막으로 나타나는 것을 의미합니다 ... – jor

+2

바로이 jor! 게다가 if ("a"== s)보다는 if (s == "a")를 쓰는 것이 더 일반적이다 (비록 그것이 더 좋은 방법이 될 수 있는지 논쟁의 여지가 있지만, 하나이기는하지만). – benroth

2

xUnit 테스트 규칙은 실제/예상됩니다. 그래서 많은 사람들에게 자연의 질서는 그들이 배운 것입니다. 흥미롭게도 xUnit의 프레임 워크 qunit에 대한 규칙에서 휴식의

예상/실제 간다. 적어도 자바 스크립트와 당신은 단지 이전을 캡슐화하는 새로운 함수를 작성하고 그것을 원래의 변수에 할당 할 수 있습니다 :

var qunitEquals = equals; 
equals = function(expected, actual, message) { 
    qunitEquals(actual, expected, message); 
}; 
4

나는 일관성 # 1이라는 합의에 동의를하지만, 비교 사전의 행동은있을 수 있습니다 이 질문을 평가하는 데 도움이되는 데이터 포인트. 내가 볼 때

는 "+"는 DIFF에, 내가 이것을 읽으면서 "절차가 테스트중인이 추가되었습니다." 다시, 개인 선호도가 적용됩니다.

참고 : I는 알파벳 순으로 키를 사용하고 사전이 더 이상 그렇게 만 중간 키가 예를의 명확성을 위해 변경됩니다했다. 다른 시나리오에서는 더 복잡한 diffs가 표시됩니다. 또한 주목할> = 2.7 assertEqual uses assertDictEqual 및> = 3.1

가 exl.py

from unittest import TestCase 


class DictionaryTest(TestCase): 

    def test_assert_order(self): 
     self.assertEqual(
      { 
       'a_first_key': 'value', 
       'key_number_2': 'value', 
       'z_last_key': 'value', 
       'first_not_second': 'value', 
      }, 
      { 
       'a_first_key': 'value', 
       'key_number_2': 'value', 
       'z_last_key': 'value', 
       'second_not_first': 'value', 
      } 
     ) 

출력 : I 보통 실제 예 assertThat 같은 매처을 (사용하게 이유

$ python -m unittest exl 
F 
====================================================================== 
FAIL: test_assert_order (exl.DictionaryTest) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "exl.py", line 18, in test_assert_order 
    'second_not_first': 'value', 
AssertionError: {'a_first_key': 'value', 'z_last_key': 'value', 'key_number_2': 'value', 'first_ [truncated]... != {'a_first_key': 'value', 'z_last_key': 'value', 'key_number_2': 'value', 'second [truncated]... 
    {'a_first_key': 'value', 
- 'first_not_second': 'value', 
    'key_number_2': 'value', 
+ 'second_not_first': 'value', 
    'z_last_key': 'value'} 

---------------------------------------------------------------------- 
Ran 1 test in 0.001s 

FAILED (failures=1) 
관련 문제