phpunit에서 assertEquals와 assertSame의 차이점은 무엇입니까?


121

PHPUnit에는 assertEquals 메소드가 포함되어 있습니다 : https://phpunit.de/manual/current/en/appendixes.assertions.html#appendixes.assertions.assertEquals

또한 assertSame 메서드가 있습니다. https://phpunit.de/manual/current/en/appendixes.assertions.html#appendixes.assertions.assertSame

언뜻보기에 그들이 똑같은 일을하는 것처럼 보입니다. 둘의 차이점은 무엇입니까? 둘 다 지정되는 이유는 무엇입니까?

답변:


198

나는 둘 다 산발적으로 사용하지만 문서에 따르면 :

assertSame

에 의해 식별되는 오류를보고 $message하는 경우 두 변수 $expected$actual같은이없는 유형가치를 . "

그리고 위의 발췌 아래 예에서 볼 수 있듯이, 그들은 전달 '2204'되고 있으며 2204, assertSame하나는 a string이고 하나는 int,기본적으로 사용 하기 때문에 실패합니다 .

'2204' !== 2204
assertSame('2204', 2204) // this test fails

assertEquals

"$ expected 및 $ actual 변수가 같지 않은 경우 $ message로 식별 된 오류를보고합니다."

assertEquals데이터 유형을 고려하지 않는 것으로 보이므로 위의 예를 사용하십시오 2204.

'2204' == 2204
assertEquals('2204', 2204) // this test passes

위의 예제에 대해 몇 가지 단위 테스트를 실행했는데 실제로 문서화 된 동작이 발생했습니다.


17
assertEquals는 '0012' == '12'. 두 값이 모두 문자열이더라도 비교를 위해 정수로 변환됩니다! 가능할 때마다 assertSame을 사용해야합니다.
marco-fiset 2013-06-28

2
불행히도 assertEquals조차도 예를 들어 배열 속성을 비교할 때 까다로워 보이고 string 대 int에 대해 불평합니다.
andig dec.

1
marco-fiset의 의견에 따라이 동작은 PHPUnit 4.0 이후로 더 이상 발생하지 않습니다 . 업그레이드 노트를 참조하십시오 .
Gras Double

@coviex 참조는 멋지지만 URL이 잘못되었습니다 (대괄호를 닫아서) ... 고칠 수 있습니까? 고마워!
Christian

3
에 중요 객체를 비교 와 함께 assertSame(). 두 변수 $ expected 및 $ actual이 동일한 오브젝트를 참조하지 않는 경우 $ message로 식별 된 오류를보고합니다. phpunit.de/manual/current/en/…
coviex

23

개체 비교와 관련하여 :

assertSame : 두 개체가 동일한 개체 인스턴스를 참조하는 경우에만 주장 할 수 있습니다. 따라서 두 개의 개별 개체가 모든 속성에 대해 정확히 동일한 값을 가지고 있더라도 동일한 인스턴스를 참조하지 않으면 assertSame이 실패합니다.

    $expected = new \stdClass();
    $expected->foo = 'foo';
    $expected->bar = 'bar';

    $actual = new \stdClass();
    $actual->foo = 'foo';
    $actual->bar = 'bar';

    $this->assertSame($expected, $actual); FAILS

assertEquals : 2 개의 개별 객체가 어떤 경우에도 속성 값과 일치하면 어설 션 할 수 있습니다. 따라서 객체 일치를 주장하는 데 적합한 방법입니다.

    $this->assertEquals($expected, $actual); PASSES

https://phpunit.de/manual/current/en/appendixes.assertions.html


7
이 답변은 포괄적 인 것은 아니지만 (객체 만 다룹니다) 정확히 알아야 할 내용입니다. 감사! :)
rinogo

20
$this->assertEquals(3, true);
$this->assertSame(3, true);

첫 번째가 통과합니다!

두 번째는 실패합니다.

그것이 차이입니다.

항상 assertSame을 사용해야한다고 생각합니다.


테스트 주도 개발 중에이 문제가 발생했습니다. 테스트 통과, 값 3이 반환되었지만 실제로 true가 반환되었다고 가정합니다. 흥미롭게도 $ this-> assertEquals ( '3', true); 실패합니다.
dwenaus

3

이전에 언급했듯이 AssertSame두 요소가 유형값을 공유하지 않는 경우 오류를보고 하지만 문서 에서이를 기록하는 것도 중요합니다 .

두 변수 $ expected 및 $ actual이 동일한 오브젝트를 참조하지 않는 경우 $ message로 식별 된 오류를보고합니다.

따라서이 테스트는 유형과 값을 공유하더라도 실패합니다.

class SameTest extends TestCase
{
    public function testFailure()
    {
        $this->assertSame(new stdClass, new stdClass);
    }
}

1

게다가,

// Passes
$this->assertSame("123.", "123.");
$this->assertEquals("123.", "123");
// Fails
$this->assertSame("123.", "123");

0

assertSame () == 실제 출력과 예상 매개 변수가 동일한 지 테스트합니다.

그건 :

$this->assertSame('$expected','$expected');

또는

$this->assertSame('100','100');

assertEquals == 웹 사이트 페이지와 관련하여 보면 2 개의 '테이블'이있는 페이지가 있으므로 assertEquals를 실행하면 카운트 함수를 사용하여 '테이블'이 2인지 확인합니다. 예 :

$this->assertEquals(2, $var->filter('table')->count()); 

여기서 assertEquals가 웹 페이지에 2 개의 테이블이 있는지 확인하는 것을 볼 수 있습니다. 괄호 안에 '#division name'을 사용하여 페이지에서 찾은 분할을 사용할 수도 있습니다.

예 2 :

public function testAdd()
{
    $calc = new Calculator();

    $result = $calc->add(30, 12);

    // assert that our calculator added the numbers correctly!
    $this->assertEquals(42, $result);
}

1
코드 부분을 더 쉽게 읽을 수 있도록 코드 서식을 사용 #하고 제목을 만들지 않는 한 마크 업을 사용 하지 마십시오 .
laalto 2013-08-14

0

앞서 언급 assertEquals()했듯이은 주로 해석 된 값에 관한 것입니다. 유형 저글링 또는 __magic 프레젠테이션 메서드를 사용하는 객체 ( __toString()예 :

에 대한 좋은 사용 사례 assertSame()는 싱글 톤 팩토리를 테스트하는 것입니다.

class CacheFactoryTest extends TestCase
{
    public function testThatCacheFactoryReturnsSingletons()
    {
        $this->assertSame(CacheFactory::create(), CacheFactory::create());
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.