Principles of Unit Testing

– [조] 내 이름은 조 퍼셀이야 나는에서 일한다

Bounteous라는 회사 우리는 몇 가지 다른 사무실을 가지고 있습니다 그러나 그들 중 2 명은 시카고에 있습니다 나는왔다 PHP를 사용하여 작업하기, 음, 2003 년 이래로

아마 지난 6 년 동안 나는 주로 Drupal에 집중했다 우리가 고용하고있어 그래서 당신이 찾고 있다면, 나에게 나중에 이야기해라 새로운 것, 나는 새로운 부모입니다 그건– – 축하해

– 축하해 (관객 박수) – [Joe] 재미있어 너의 일상과 같아 다만 아주 다르다 – 이거 처음 이니? – [Joe] 이것이 처음입니다, 예, 우리를 위해서 예

몇 살 이니? – 여섯 달이야 오, 정말 즐겁기 시작 하네 (웃음) – [조] (웃음) 네, 저도 많이 즐기고 있어요 하지만 재밌 네요 왜냐하면 내가 누군지 생각할 때, 확실히 관련성있는 전문적인 것들, 그러나 때로는 개인적인 비트가 이야기하는 것이 재미 있습니다

몇 년 전, 저는이 슬라이드를 추가하게되어 영감을 받았습니다 이 프레젠테이션에 다시 추가하고 싶었습니다 사람들에게 감사의 말을 전하고 싶다 누가 Drupal에 나를 도왔는지 이런 캠프에 가기는 좋은 기회입니다

네가 만난 적이없는 사람에게 인사하는 것, 누가 알 겠어? 어쩌면 당신이 알고있는 다음 것, 당신은 당신 자신의 contrib 모듈을 작성할 것이고, 또는 다시 기여할 수도 있고 아니면 해결책을 찾을 수도 있습니다 네가하고있는 문제에 하지만 개인적으로 Drupal 커뮤니티를 찾았습니다 매우 도움이 될 것입니다 그래서 나는 이것을 너에게 격려의 말로 던져 버린다 새로운 사람들을 만나기 위해서는

나는 너희 모두가 가질 것으로 기대하고있다 단위 테스트 경험 이것은 중간의 이야기입니다 어떤 사람들에게는 더 발전 할 것이고 다른 사람들에게는 덜 할 것입니다 당신이 아니라면, 당신이 안으로 떨어질 것 같이, 나는 단위 테스트를하는 초심자 일 뿐이다, 괜찮아

조금 더 느리게하려고 노력할 것입니다 정말 관련이있는 부분들로 한두 가지 질문에 대해 잠시 멈추십시오 그리고 많은 단위 테스트를 마친 사람들에게, 제가 여러분에게 권장하는 것은 제가 공유하고있는 아이디어를 가지고가는 것입니다 그것들을 뒤집어 쓴다 그리고 그것이 너와 함께 있으면 나에게 알려줘

당신이 단위 테스트에 대해 어떻게 생각하는지 공감한다면 The Mythical Man-Month에서, 그것은 프레드 브룩스 (Fred Brooks)가 몇 년 전에 출판 한 책이며, 이것은 실제로 그것에있는 덮개에, 그는 크고 작은 프로젝트에 대해 이야기하고 있습니다 문제가 발생했는지 여부에 상관없이 예산, 타임 라인, 당신은 제품을 출시하고 더 이상 적합하지 않습니다 당신이 이것을 충분히 오랫동안 해왔다면, 당신은 분명히이 경험을 겪었습니다 코드베이스의 중력과 같은 느낌 또는 프로젝트의 과제가 무엇이든간에 그냥 너를 무겁게하고있다

그래서, 당신이 정말로 열심히 밀어 넣는 것을 좋아한다면 중요하지 않습니다 타르 구덩이에서 발을 한 개 위로 가져와 다른 발이 다시 아래로 가라 앉고 있습니다 그리고 나는이 문제를 해결하기 위해 이것을 좋아한다 우리가 말하고있는 것은 고품질의 소프트웨어입니다 단위 테스트는 한 가지 방법입니다

우리는 우리 업무의 질을 보장 ​​할 수 있습니다 나는 놀랐다 같은 문제를 반복해서 실행함으로써, 그러나 우리가 그들을 풀어야한다면, 우리는 분명히해야합니다 문제가 무엇인지 우리가 제안하고있는 솔루션, 그래서 네가 나 한테 들려 줄 뭔가가 몇 번이나 얘기해 반복해서 명확한 정의에 도달하려고합니다

어떤 단위 테스트가 우리 모두가 동의하고 채택한다는 것입니다 네가 떠나길 바라는 두 가지가있다 하나는 단위 테스트입니다 다른 하나는 귀중한 것입니다 모든 시나리오가 아니기 때문에 단위 테스트를위한 좋은 시나리오가 될 것입니다

그래서 네가 갈 수 있다면 그리고 당신은이 두 가지를 명료하게 말할 수 있습니다 나는 성공적인 세션이라고 생각할 것이다 우리가 이것에 관해 갈 방법 정의부터 시작하겠습니다 두 가지 원칙에 대해 이야기하겠습니다 나는이 원칙들을 고려한다

언어와 상관없이 또는 작업중인 테스트 프레임 워크, 이 두 가지 아이디어는 관련성이 있습니다 당신이 그들을 이해하고 실행할 수 있다면, 당신은 단위 테스트를 잘 할 수있을 것입니다 나는 그 원리들을 사용하는 두 가지 예를 거쳐 갈 것이다 실제로 테스트 냄새 섹션을 건너 뛸 것입니다 단지 시간 문제에 대해서, 결국 나는 동기에 대해 이야기 할 것입니다

동기는 재미있는 부분입니다 나는 이것이 더 이상하다고 말할 것이다 나는 말하기 싫다고 말하고 싶지 않다 내가 개인적으로 정말 흥분되는 걸로 알았어 코딩의 핵심적인 내용에 대해 이야기하고, 그러나 나는이 것을 정말로 즐겁게 생각하지 않을 것입니다

따라서 많은 지식 공유가 이루어질 것입니다 질문이 있으시면 말씀해주십시오 네 시험 냄새를 건너 뛰고 있기 때문에, 당신은 그것이 무엇인지를 설명하는데 잠깐 시간을 할애 할 수 있습니까? – [Joe] 네, 물론 가능합니다 실제로 테스트 냄새를 맡을 슬라이드 하나가 있습니다

좋아, 정의 좌절감을 느끼면 손을 들어주세요 단위 테스트에 대한 정의의 불일치로 및 기타 유형의 테스트 조금 애매한 것 같아 약 절반 정도는 방 이상입니까? 괜찮아

따라서 단위 테스트를 통한 여정에서 및 기타 유형의 테스트, 나는 정의에 의해 반복적으로 좌절감을 느낀다 나는 대화에서 당신이이 원형에서 끝난다는 것을 알지만, 원형 논리처럼, 그리고 당신은 깨닫습니다 오, 우리는 단위 테스트에 대해 말하는 것이 아닙니다 우리는 정말로 통합에 대해 말하고 있습니다 또는 기능 또는 UI 테스트

이 정의에 대한 한 가지 도전은 거의 모든 테스트 프레임 워크에는 자체 정의가 있습니다 암시 적 방법론을 테스트하는 방법이나 명시적인 방법에 대해 설명합니다 나는 모든 책을 다 읽었다 내가 단위 테스트에 관해 알 수있는 거의 모든 사람들이 다른 정의를 가지고 있습니다 블로그 게시물, 팟 캐스트, 모두가 단위 테스트에 대해 이야기합니다

다른 방식으로 적어도 미묘한 차이로 때로는 매우 다르다 여기서 내가 제시 할 것은 무엇인가? 내가 통합을 고려하는 것입니다, 또는, 그러나 나는 그 정의들에 걸쳐 보았던 공통점이 무엇인지, 그래서 당신은 무엇을 빼앗아 갈까요? 당신 팀이 또는 읽고있는 블로그 게시물이 다르게 취급됩니다 여기의 개념이 적용되어야합니다 그렇다면 단위 테스트 란 무엇입니까? 나는 가장 자주 인용 된 위키 피 디아 페이지를 발견했다 흥미 롭 네요

거대한 단락 설명 xUnit 테스트 책에서, 그들은 실제로 정의를 용어집에 넣었습니다 1,500 페이지 분량의 책 뒷면에 있습니다 나는 그것을 앞에 가져오고 싶다 마틴 파울러 그것이 상황에 맞는 것으로서 포스트로 표현했다

팀이 목적을 결정하게하십시오 단위 테스트가 무엇인지 시스템에 대한 이해 나는 그것이 그것의 중심에 도착하기 때문에 이것을 좋아한다 궁극적으로 팀은 단위 테스트를 소유해야합니다 네가 잘 할 수 있다면

그러나 그는 또한 부른다 그 소프트웨어 개발 커뮤니티 단순히 테스트에 대해 잘 정의 된 용어로 해결하지 못했지만, 나는 더 잘하고 싶다 나는 더 잘할 수 있다고 생각한다 그래서 나는 그것에 균열을 가져갈거야 제안 된 정의는 다음과 같습니다

단위 테스트는 단위의 정확성을 확인합니다 명세에 반하여 그래서 내가 이것에 관해 좋아하는 것은 그것이 돌아온다는 것입니다 공식 검증의 근원 및 수학 그 중 일부는 거기에서 사용됩니다 단위를 함수로 생각할 수 있습니다

클래스에 대한 메소드 또는 스크립트 제 생각 엔 제 3의 것이지, 때때로 이것을 고려하지 않은 것입니다, 하지만 스크립트는 코드 단위로 생각할 수 있습니다 네가 할 수있는 일 이니까 그것은 하나의 일이며, 스텝 디버거를 사용했다면, 그것을 생각하는 것이 도움이 될 수 있습니다 호출 스택에서 하나의 프레임으로

여기에 캐시 ID가 있습니다 당신은 그것을 하나의 것으로 생각할 수 있습니다, 또는 스택을 올라가서 말할 수 있습니다 미들웨어의 핸들 메소드는 하나의 단위입니다 아주 간단한 예입니다 증분이라는 함수가 있습니다

그것은 매개 변수를 취한다 그 매개 변수와 하나의 정수를 반환합니다 그래서 그것은 하나씩 증가하고 있습니다 여기 테스트 이것은 간단한 테스트입니다

필자의 예제 중 대부분은 PHPUnit이 될 것이다 그래서 이것은 이것을 테스트하는 아주 기본적인 방법을 보여 주며, 정수 하나를 넘기는 지 확인하려면, 정수 2를 반환합니다 그래서 우리의 테스트에서, 우리는 정수를 하나씩 increment라고 부릅니다 우리는 주장을 쓰고있다 그 중 하나를 사용하여 increment를 호출 한 결과 정수 2이므로이 값이 통과해야합니다

드루팔 (Drupal) 코드베이스를 살펴볼 때, 단위 테스트에 대해 이야기 할 때, 테스트 수준에 대해 이야기하는 것이 도움이된다고 생각합니다 가장 단순하거나 가장 낮은 수준 독방 단원 테스트라고 부르는 것입니다 나는 독방에 의해 의미하는 것을 설명 할 것이고, 하지만 Drupal에 UnitTestCase가 표시됩니다 나는 그 종류가 일치한다고 생각한다 우리가 여기서 말하는 것에, 또는 사교적 인 단위 테스트가있을 수 있으며, 약간 높은 수준이지만, KernelTestBase 클래스를 찾을 수 있습니다

단위 테스트보다 조금 더 높은 수준으로 사용됩니다 기능 테스트, 어느 BrowserTestBase가 그것에 대응할 것인가 혼란스럽고, 이 모든 것은 PHPUnit의 단위 테스트에서 수행 될 수 있습니다 그래서 나와 맺어 라 특정 프레임 워크에서 한 걸음 물러서서 높은 수준의 개념적 이해, 우리가 단위 테스트에 대해 이야기하는 것과 같습니다

나는 빨리 비유 할 것이다 이게 붙어 있을지 모르겠다 하지만 아마도 여러분 중 일부는 도움이 될 것입니다 이것은 만들어진 다리의 사진입니다 그들은 그것을 시험하고있다

교량을 가로 질러 석탄 열차를 몰아서, 그것을 조사하는 사람이있다 콘크리트에 어떤 결함이 있는지보기 위해서입니다 이것은 단위 테스트가 아닙니다 일단 모든 것을 갖추게되면 너는 그 물건 전체를 시험하고있어 그것은 단위 테스트가 아닙니다

하지만이 이미지에서 스틸 빔을 보여줍니다 그 다리에서 사용 된 것일 수도 있습니다 그리고 그것이 다리에 들어가기 전에, 당신은 시험하고 있습니다, 너는 강철에 대한 스트레스 테스트를하고있어 그것이 어떤 종류의 것, 규정이 무엇이든, 어쩌면 그것은 빔에 가해지는 압력의 양일 수도 있습니다 그럼 그게 말이 되니? – 예

– 괜찮아 원칙 당신이 아무것도 가지고 오지 않는다면, 이 부분에주의를 기울이십시오 네가 정말로 이해할 수 있다면 나는 생각한다 팀과 함께 채택하십시오

유닛 테스트가 더 원활하게 진행될 것이라고 생각합니다 얼마나 많은 사람들이 테스트 더블이 무엇인지 알고 있습니다 test double이라는 구를 사용한다면? 너 몇? 이것이 첫 번째 개념입니다 나는이 이미지를 사용한다 Black Panther를 보지 못했다면, Marvel 영화, 나는 그렇게하도록 권장합니다

정말 좋은 영화예요 왼쪽에는 다나이가 보입니다 누가 오코 예의 성격을 담당하는지, 오른쪽에는 Janeshia가 보입니다 누가 그녀를 위해 스턴트 더블이야 그래서 영화의 일부 액션 장면들 실제로 Danai 같이 보이는 누군가에 의해 실제로한다, 그러나 약간의 기술과 훈련이있다

그 스턴트 중 일부를 할 수 있습니다 Janeshia에 관해서는 흥미로운 점이 있습니다 그녀는 프로 레슬러였다 그녀는 미국 국가 대표팀의 일원이었고, 그녀는 태권도와 체조를했고, 그리고 그녀는 8 시간에서 10 시간 정도 훈련 할 것입니다 매일 영화에 이르는 몇 주 동안

그러나이 이미지의 요점은 테스트 더블 매우 유사한 두 가지가 있습니다 하지만 그들은 다르다 그래서 하나는 다른 하나를 사칭하기위한 것입니다 테스트 더블을 사용하는 이유는 간접적 인 정보가있는 곳, 어떻게 생겼는지 예를 보여 드리겠습니다 이 공유 상태를 호출 할 수도 있습니다

그래서 그것은 사용되는 정보입니다 코드베이스의 다른 영역에 의해 쉬운 예는 데이터베이스에서 데이터를 가져 오는 것입니다 테스트 복식을 사용하는 다른 시나리오 간접적 인 결과이므로, 부작용, 어쩌면 당신은 데이터베이스에 글을 쓸 것입니다 테스트를 이중으로 사용할 수도 있습니다

너는 그걸 아무것도라고 생각할 수있어 그것이 순수한 함수가 아니라, 순수한 기능이 무엇인지 모르는 경우, 그것에 대해 읽으려면 메모를 작성하십시오 PHP가 아닙니다 일부 언어가 있습니다 그것들은 순전히 기능적인 언어이다 그것에 대해 읽는 것은 흥미 롭습니다 소개 된 문제 언어가있을 때 PHP처럼 순수하게 기능하지 않습니다 간접 입력의 예로, get_product라는 함수가 있습니다

그것에서, 로딩 중이라고 가정 해 봅시다 데이터베이스의 해당 제품 그것은 간접적 인 의견입니다 왜 이것이 문제입니까? 테스트를 통해 해당 기능을 실행하면, 데이터베이스가 없다면 예외가 있습니다 읽을 데이터베이스가 없습니다

따라서 테스트 더블은 라이브 데이터베이스를 가지고 있어도됩니다 간접 입력은 다음과 같이 보일 것입니다 여기서 우리는 increment_product_favorite_amount를 호출합니다 이 예제를 만들고 있습니다 하지만이 함수에 제품을 전달한다고 상상해보십시오

좋아하는 카운트를 증가시키는 것입니다 그 제품을 저장합니다 글쎄, 만약 당신이 그걸 시험하려고하면 데이터베이스가 없으면 예외가 발생합니다 맞습니까? 다섯 가지 유형의 테스트 복식이 있습니다 당신이 사용할 수 있습니다

더미는 절대 호출되지 않습니다 그것은 단지 클래스 또는 정보 조각 일뿐입니다 그것은 실제로 클래스를 인스턴스화하는 데 필요합니다 또는 테스트중인 장치 가짜는 가짜와 비슷하지만 불린다

그래서 거짓, 당신은 결코 그것을 부르지 않습니다, 당신은 결코 그것과 상호 작용하지 않습니다, 하지만 아마도 전달되어야하는 매개 변수 일 수 있습니다 그러나 가짜 일 경우, 실제로 그것을 호출하고 상호 작용할 것입니다 그리고 가짜 정보는 하드 코드 된 것 같습니다 테스트 더블에 스텁 유사하다, 그러나 일반적으로 스텁 간접 입력을 제공합니다

당신의 시험에서, 간접 투입물이 무엇인지를 다양하게 할 수 있습니다 스파이, 그것은 스텁과 비슷합니다 그러나 당신의 간접적 인 결과를 얻을 수 있습니다 우리는 이들 각각의 예를 보여줄 것입니다 그래서 이것들을 흡수하기 위해 잠깐 시간을 가져야합니다

그리고 마지막 하나는 조롱입니다 간접 입력을 제공합니다 간접적 인 결과를 검증합니다 내가 실망하게 만드는 것 사람들이 모의 의사를 말하면서 시험 두배를 의미하는 때입니다

모의 (mock)은 단지 다섯 가지 유형 중 하나이기 때문입니다 다섯 가지 유형의 테스트 복식이 있습니다 이제 몇 가지 예를 살펴 보겠습니다 그래서 우리가 테스트를했다고 상상해보십시오이 테스트에서 우리는 이 유권자 수업 기본적으로 생성 된 권한을 부여하고, 그래서 우리는 토큰 더미를 설정했습니다

왜냐하면 이것은 단지 필요한 데이터 일 뿐이 기 때문입니다 내가 투표 방법을 부를 때 우리는 다른 더미를 만든다 그것을 우리의 투표 방법에 전달하십시오 여기에서 부르는 것은 더미 더미인데, 첫 번째 것은 PHPUnit에서 getMock을 호출하고, 그것이하는 일은 그것이 돌아 오는 것입니다

당신이 전달하는 클래스의 두 배가되는 객체 그래서 멋진 점은 무엇입니까? 네가 원하지 않으면 일부 매개 변수를 처리해야합니다 더미에 넣으려는 클래스의 건설 매개 변수처럼, 당신은 getMock을 호출함으로써 그렇게 할 수있다 몇 가지 예를 찾을 수 있습니다 당신이 그것에 대해 더 알고 싶다면

또는 표준 클래스를 전달할 수 있습니다 그래서이 예제에서 더미 더미는 객체를 필요로합니다 하지만 기본적으로 호출 된 적이 없으므로 전달해야합니다 왜냐하면 내가하지 않으면 실패 할거야하지만 반드시 그렇지는 않아

객체에 대한 정보가 있어야합니다 그래서 이것은 더미가 사용될 수있는 예입니다 이 테스트에서 나는 그것을 확인하고있다 기본적으로 BinaryFileResponse X-Accel-Redirect를 파일의 경로로 설정합니다 그래서 여기 나는 위조 된 파일을 만들었고, 이 파일이 가짜 파일 클래스라는 것을 알 수 있습니다

이제 상상해보십시오 나는 여기에 코드를 보여주지 않을 것이지만, 내가 떠났다고 상상한다 FakeFile이라는이 클래스를 만들었습니다 그리고 그것에는 모든 방법과 그런 것들이 있습니다 하지만 결코 디스크에서 읽고 쓰는 것을 좋아하지 않습니다

읽기 전용 메소드가 있더라도, 하드 코딩 된 값을 반환합니다 나는 그것을 BinaryFileResponse로 전달하고, 그리고 그것이하는 일은, 내가 주장을 할 수있게 해준다 그 헤더는 제가 말한 파일의 경로라고합니다 가짜는 다음과 같은 경우에 사용할 수 있습니다 나는 파일 시스템이 정말로 좋은 예라고 생각한다

가짜 파일을 쓰면 모든 종류의 작업에서 사용할 수 있습니다 실제로 파일 시스템을 가질 필요는 없습니다 스텁 간접 입력을 제공 할 수 있습니다 그래서이 경우에 내가 여기서 보여주고있는 것은 이 authorization_checker 클래스입니다, isGranted 메서드 사실을 돌려 줄 것입니다 그래서 필자는 PHPUnit을 사용하여, 당신은 학급의 두 배를 얻을 수 있습니다

일단 그 두 배가되면 할 수있는 또 다른 일 너는 말할 수 있니, 좋아,이 방법은 돌아올거야 특별한 가치를 지니고 있습니다 그 방법에 상관없이 그 클래스에 있습니다 그래서이 경우, 우리는 그것을합니다 그래서 컨트롤러를 인스턴스화 할 때 그리고 그것이 승인되었는지 확인하십시오, 우리는 그것이 사실임을 주장하고 싶습니다, 이 예제는 약간의 인위적인 것이지만, 하지만 스텁이 어떻게 보이는지 알 수 있습니다

간접 정보를 전달하는거야, 그렇지? 나는 테스트 컨트롤러에 진실을 말하지 않았다 그 위에 방법이있는 객체를 전달했습니다 스파이 예언 (Prophecy)이라는 도서관이 있습니다 PHPUnit과 함께 사용할 수 있습니다

간접적 인 결과를 포착한다 이 경우 우리가하는 일은 우리는 가짜 사용자를 만들거나, 두 배로 말해야합니다 사용자의 테스트 더블 당신은 이것을이 프로파일 클래스에 전달합니다 그리고 나서 우리는 마지막 두 줄에서 나중에 주장 할 것입니다

우리는 getFullName을 호출 할 때, 이름을 부를거야 이제 너는 그런 주장을하지 않는다 이렇게하면 실제 사용자 만들기 이름과 성을 입력하고 출력의 유효성을 검사합니다 전체 이름처럼 성과 이름이 있습니다 이것은 당신이 좋아하는 것을 알 수있게 해줍니다, 좋아, getFullName을 호출하면이 두 메서드가 호출됩니다

다시 한 번 조금 고안되었지만 잘하면 아이디어를 얻을 수 있습니다 스파이가 어떤 메소드가 호출되었는지 파악하고 있습니다 모의는 비슷한 것을합니다 이것은 스텁과 비슷하지만 한 가지 차이점이 있습니다 여기서 우리는 getFirstName 한 번 불러야합니다

getFirstName 메소드가 있습니다 반환 할 값을 지정하고 있습니다 그리고 나서 우리는 기대하고있다 성이 부름을받을 것입니다 모의, 스텁 및 스파이의 차이점은 무엇입니까? 예, 그들은 모두 간접 입력을 제공합니다

그러나 실행에 관한 모의는, 이것이 호출되지 않으면 실패를 throw합니다 그래서 모의 실행 시간 동안 주장합니다 한 가지 이유는 이것이 하나의 이유입니다 나는 많은 양의 모가들에게 관심이 없다 당신의 주장이 분명하지 않다

테스트에서 설정을 읽어야합니다 그 주장이 어디에 있는지 읽어야 할 것입니다 나중에 문제가되는 이유를 다시 살펴 보겠습니다 당신은 무엇을 두배로해야합니까? 언제 테스트 더블을 사용해야합니까? 다른 접근 방식이 있습니다 하지만 나는 그것을 다음과 같이 분류 할 것이다

당신이하고 있는지에 따라 달라집니다 독방 또는 사교적 인 단위 테스트 그래서 우리 다리 비유로 돌아가서, 당신이 한 유닛을 가져갈 때 당신은 그걸 고립으로 테스트하고 있습니다 그것은 매우 독방적이므로 그 예와 비슷합니다 강철 받침대가있는 곳 당신은 그 지구력을 시험하고 있습니다

사교적 인 것은 당신이 더 많은 것을 가지고 있다는 것을 의미합니다 런타임 중에 더 많은 코드가 테스트되고 있습니다 그럼 어떻게 다릅니 까? 사실 Jay Fields에서이 아이디어를 얻었습니다 그는 Unit Tests와 함께 효과적으로 일하는 책을 썼고, 그 차이를 설명하는 방법 사교적 인 테스트가 어떤 경계를 넘을 것이라는 것, 우리는 두 번째 경계가 여기에 있다는 것을 이야기 할 것입니다 그러나 독방은 결코 경계를 넘지 않을 것이다

사교적 인 테스트를 통해, 테스트하는 동안 하나 이상의 구체적인 클래스를 갖게됩니다 그러나 독방과 더불어, 당신은 단지 1를 가지고있다 그래서 단독 테스트 중에, 당신은 테스트하고있는 유닛 만 가지고 있습니다 인스턴스가 생성되고 실행됩니다 경계는 데이터베이스, 대기열입니다

네트워크 통화 일 수도 있고 협력 업체 일 수도 있습니다 그래서 약간의 코드를보고 있다면 다른 클래스에서 메서드를 호출하는 것을 볼 수 있습니다 그 다른 계급은 그 단위의 경계 밖에있을 것입니다 이것을 단일 책임으로 생각할 수 있습니다 그것은 경계를 생각하는 또 다른 방법 일 수 있습니다

그래서 다른 클래스에서 메소드를 호출하면, 그 다른 것은 책임이 아니다 당신이 테스트하고있는 유닛의 구체적인 수업은 무엇을 의미합니까? 즉, 클래스에 속한 모든 종속성, 당신은 테스트 더블을 사용할 것입니다 그래서 당신이 수업을 테스트한다면 4 개의 생성자 매개 변수가 있습니다 각자 테스트 더블이 있어야합니다 독방 테스트를하고 있다면

또한 객체를 반환하는 공동 작업자 테스트 복식을 반환해야합니다 공동 작업자가 있다면 다른 공동 작업자를 반환합니다 그 클래스도 두 배가되어야합니다 다시 한번, 독방에요, 외롭죠 다른 일은 일어나지 않습니다

통계학이이를 위반합니다 그래서 드루팔 (Drupal은 많은 통계학을 사용합니다 Laravel을 사용하면 정적 호출이 많이 발생합니다 엄밀히 말하면, 정적 호출이있는 경우 네가 테스트하고있는 유닛에서, 독방 검사의이 원칙을 위반하게됩니다 그 하나의 값은 값 객체입니다

그래서 전혀 행동이없는 클래스가 있다면, 데이터를 반환하는 것뿐입니다 나는 그것이 예외다고 말할 것이다 따라서 런타임 중에 해당 클래스를 인스턴스화 할 수 있습니다 독방 테스트의이 원칙을 계속 따르고 있습니다 그 경우에 나는 그 대상을 비헤이비어가있는 클래스가 아니라 데이터 구조가됩니다

이 순간, 당신의 머리는 폭발적 일 것입니다 지식의 전부인지 확실하지 않을 수도 있습니다 아니면 그냥 혼란 스러워요, 그래서 우리가 방금 다루었 던 것을 되풀이합시다 그런 다음 몇 가지 질문을 할 수 있습니다 따라서 단위 테스트는 단위의 정확성을 검증합니다 명세에 반하여 간접 입력에 대한 테스트 복식을 사용하고, 그 중 다섯 개가 있습니다

경계는 간접적 인 입력 또는 출력입니다 사교적 인 테스트를 통해 몇 가지 경계를 넘을 수 있습니다 테스트 중에는 여러 개의 클래스가 있습니다 그리고 독방에서, 당신은 결코 경계를 넘지 않습니다 테스트하는 동안 하나의 구체적인 클래스 만 있습니다

질문 있니? 모두 추적하고 있니? 괜찮아 – 질문 있네 – 의문 그래 제발

그럼 너도 그걸로 시험해볼거야 이상한 점을 테스트하는 것에서? 첫 번째 것과 마찬가지로, 당신은 아주 구체적인 것을하고 있었고, 당신은 그것에 대해 매우 구체적인 것을 표현하고 있습니다 단위 테스트의 일부로 사용 하시겠습니까? 당신이 생각하고 있지 않은 이상 치를 테스트하십시오 아니면 다른 유형의 테스트의 일부입니까? – [Joe] 그래서 문제는 단위 테스트입니다 이상 치를 테스트 해 주시겠습니까? 양성 테스트 대 음수 테스트와 같이, 내 테스트의 사양을 알고, 나는 정수를 전달한다

그 정수에 1을 더한 값을 반환해야합니다 그러나 당신이 말하는 시험을해야합니까, 문자열을 전달하면 반환 값은 무엇입니까? 나는 그 단위 테스트 유형을 주장 할 것이다 종종 긍정적 인 경우보다 더 가치가있다 아마도 단위 테스트가 더 많을 것입니다 당신이 긍정적 인 행동을하는 것보다 부정적인 경우에 대해서

오류 처리 및 소프트웨어의 엣지 케이스가 중요합니다 나는 웹 개발에서 여러 번 간과 될 것이라고 생각한다 비판적이기 때문에, 그렇지? 일부 웹 사이트는 그렇지 않습니다 그 엣지 경우들 중 하나의 충격처럼 꽤 작을 수도 있고, 그러나 소프트웨어 산업의 다른 분야에서는, 항공과 같이 정말로 중요합니다 예기치 않은 시나리오를 테스트하지 않는 경우, 그게 엄청난 책임이야, 그렇지? 그럼 그게 도움이 되나요? 그래, 그게 일부 야

– [조] 그래, 짧은 대답은 예, 예 계속 진행하기 전에 다른 질문이 있으십니까? 그리고 우리는 그것에 대해 좀 더 이야기 할 것입니다 괜찮아 괜찮아 예제를 통한 원리

그래서 나는 Drupal에서 이것들을 꺼냈다 나는 이것들을 조금 빨리 지나갈거야, 그래서 나는 질문을 위해 잠시 멈추지 않을 것이다 이것은 우리가 이러한 것들을 보는 것이 더 좋습니다 우리가 본 두 원칙을 실천하십시오 그래서이 배치 스토리지 클래스를 볼 때 이로드 메소드를 살펴보면, 단위 테스트를하고 싶다고 말하면 몇 가지가 있습니다

그것은 단위 테스트를 어렵게 만듭니다 확실하지 않은 것들을 볼 수 있다면, 그러나 나는 그들을 불러 낼 것이다 이 방법은 귀하가 세션을 시작할 수있는 능력 세션 저장소를 설정 했습니까? 이걸 실행하기 전에? 때로는 테스트 프레임 워크 이미이 문제를 처리하고 있지만 그렇지 않은 경우, 당신은 그것을 설명 할 필요가 있습니다 또한 데이터베이스가 있다고 가정합니다

이것을 실행할 때 데이터베이스가 있습니까? 어떻게 영향을 미칩니 까? 테스트를 할 때 실행 속도가 빠릅니까? CSRF 토큰을 얻을 수있는 서비스가 있다고 가정합니다 모의를 사용하여 예제를 살펴 보겠습니다 여기에 우리의 테스트와 내가 원하는 테스트가 있습니다 또는 나의 명세는, 나는 단지 그것을 확인하고 싶다 배치를로드하면 세션이 시작됩니다

그래서 여기, 나는 세션 시작을 조롱한다 그래서 이것은 시작 메소드가 호출되고 있다고 말하면서, 그리고 이것은 실제로 우리의 주장입니다 기억하십시오 모의가 실제로 시험의 주장을하기 때문에 데이터베이스에서 입력을 스텁합니다

그래서 데이터베이스를 실행할 필요가 없습니다 나는 CSRF 토큰을 거짓으로 만든다 왜냐하면 실제로 가치가 필요하지 않기 때문이다 마지막으로 테스트중인 클래스를 실행합니다 그럼이게 효과가 있겠지? 이것은 작동하는 단위 테스트입니다

그러나 우리는 그 주장을 더 명백하게 할 수 있을까요? 이것은 시험 복식을 아는 것이 도움이 될 수있는 곳입니다 그래서 스파이를 사용해보십시오 그래서 여기에 우리는 전체 설치 프로그램을 가지고 있습니다 나는 이것을 밖으로 부르지 않는다 하지만 당신은 내가 스파이를 사용하고있는 곳을 볼 수 있습니다

첫 번째 라인은 테스트 더블을 생성합니다 예언 프레임 워크를 사용하여이 라인을 강조했습니다 우리는 테스트중인 클래스를 호출하고 있습니다 그리고 우리의 주장은 여기서 끝나기도합니다 그래서 이것은 불려지는 것입니다

모든 설정을 의미합니다 당신의 시험의 상단에 완료됩니다 당신은 테스트중인 유닛에서 행동하고 있습니다 끝 부분에 null 어설 션이 나타납니다 그래서 내가 어떻게 말했는지 기억해

내가 너무 많이 모의 돌보지 않는다고? 이것은 하나의 예입니다 너는 진짜로 배열하고, 행동하고, 모의를 사용하여 단언 할 수없고, 하지만 당신은 스파이를 사용하여 그것을 할 수 있습니다, 그래서 그것은 그것을 좀 더 분명하게 만듭니다 두 번째 예는 더 복잡 할 것입니다 추적하는 데 문제가 있으면 괜찮습니다 We 'll는 그것을 빠져 나갈 것이다

그리고 나는 다른 약간의 물건에 가고 싶다 따라서 이것은 유지 보수 모드 가입자입니다 내가 드루팔 (Drupal 8)을 꺼냈다 여기에 많은 일이 있습니다 간접 입력, 간접 출력을 확인할 수 있는지 확인하십시오

여기에 몇 가지가 있습니다 우리는 두 가지 정적 호출을 가지고 있습니다 함수 호출이 있습니다 우리는 독방 유닛 테스트를 할 수 없다 그래서 내가 제안 할 것은 우리가 그것을 리팩터링하는 것입니다

그래서 우리는 그것을 단위 테스트 할 수 있습니다 하지만 리팩토링을하기 전에 테스트를하고 싶습니다 우리가 아무것도 깨뜨리지 않았 음을 확인하는 거지? 긴 이야기는 더 높은 수준의 테스트를 작성합니다 아마도 데이터베이스를 추가 할 것입니다 테스트 할 수없는 코드를 삭제하십시오

우리는 나중에 다시 구현할 것입니다 반원들에게 두 가지 책임을 부탁하십시오 그래서 우리는 단지 확인하고있는 것을 가질 것입니다 또는 유지 보수 페이지를 생성하는 페이지 우리가 추측하고 싶지 않기 때문에 모든 페이지가 HTML이 될 것입니다 JSON 일 수도 있고 XML 일 수도 있습니다

그리고 다른 책임은 결정할거야 유지 보수 모드 페이지가 켜져 있고 적용해야하는 경우 단위 테스트를 작성하겠습니다 결국 상위 레벨 테스트를 삭제합니다 우리가 필요하지 않기 때문에, 우리는 지금 단위 테스트를 가지고 있기 때문에

이게 어떻게 나올지 좀 보여줄거야 책임을 분담하여 단위 테스트 작성하기 책임감 1, PHPUnit에 대해 멋진 점이 하나 있습니다 당신은 실제로 인터페이스의 구현이 필요하지 않습니다 그것을 가진 시험을 사용하기 위하여, 기억해라, 나는 두 배의 시험을 얻는다고 말했다

그것은 단지 클래스의 double을 생성합니다 그래서 내 구현이 인터페이스를 찾고있는 한 구체적인 수업이 아니라 나는 인터페이스와 함께 전체 테스트 스위트를 작성할 수있다 실제로 존재하는 구체적인 클래스가 없습니다 그래서 내가 다시 가게 해줘 여기이게,이 수업은 책임질거야

응답을 얻으려면, 그래서 Accept 헤더를 읽을 것입니다 JSON을 리턴해야하는지 탐지하고, 또는 XML 또는 HTML 또는 기타 무엇이든간에 응답을 반환하고 응답을 반환합니다 유지 관리 모드 구독자를 리팩토링하고 있습니다 그냥 확인 유지 관리 모드가 적용되는 사용자가 해당 유지 관리 페이지에서 제외되는지 여부를 나타냅니다 다른 모든 것은 이제 다른 클래스에서 처리됩니다

이제는 쉽게 테스트 할 수 있습니다 쉽게 말할 수는 있지만 복식을 이용한 단위 테스트는 어렵습니다 그래서 여기에 우리는 우리의 계좌에 대해 두 배의 테스트를 받게됩니다 우리는 3 가지 종속성을 고려해야합니다 계정, 우리는 유지 보수 모드를 스텁 (stub) 그래서 우리는 유지 보수 모드가 켜져 있다고 말한다

우리는 응답을 스텁 요청을 스텁하고 테스트중인 유닛을 호출합니다 단언하다 여기에 우리가 주장하는 것은 유지 보수 모드가 켜지면, 해당 유지 관리 모드 페이지 구현 응답을 설정할 수 있습니다 이것에 대해 좋은 점은 무엇입니까? 우리가 시험하기 어려운이 수업을 듣는 것 같아

우리는 리팩토링을 통해이를 테스트 할 수있게 만들었습니다 우리 반은 지금 한 가지 일을합니다 그것은 좋은 단일 책임감, 견고한 프로그래밍입니다 우리는 한 가지를 시험 할 수 있습니다 이 클래스는 7 개가 아니라 3 개의 종속성을가집니다

그래서 우리는 이제 코드를 분리합니다 더 읽기 쉽고 테스트하기 쉽습니다 비 HTML 응답이 반환 될 수 있도록 추상화됩니다 그래서 당신이 그것을 읽었는지 모르지만 어쨌든 어디 보자

몇시에 나올거야? 10 분 남았 어? 2시 30 분? – 2시 30 분 – 10 분 남았어요? 괜찮아 그래, 10 분? 괜찮아 – 아니, 2시 30 분까지있어 – 2시 반은

– 20 분 – 20 분 – 20 분

– [Joe] 좋아, 좋아, 좋아 나는이 보로미르 밈을 아주 좋아합니다 단순히 단위 테스트를 작성하는 것이 아닙니다 나는 높은 수준에서, 많은 사람들이 단위 테스트가 잘되어 있고, 하지만 일단 코드를 파헤 치면 코드가 있음을 알 수 있습니다 일부 코드는 실제로 테스트하기가 어렵습니다

전체 라이브러리 또는 코드베이스를 가지고있을 때 TDD를 사용하는 곳, 또는 단순히 레거시 코드베이스를 가지고 있다면 당신은 단위 테스트를 작성하고 싶습니다 너는 문제가 생길거야 그리고 그것은 당신이 시험 냄새를 맡을 곳입니다 우리는 그들 모두를 다 커버하지 않을 것입니다 그래서 마틴 파울러 (Martin Fowler)가 쓴 리팩토링 (Refactoring)이라는 책이 있습니다

그 안에 그는 다른 항목으로 분류한다 코드 냄새 xUnit 테스트 서적을 보면, 그들은 시험 냄새에 대해 이야기합니다 두 경우 모두 코드를 볼 때입니다 코드로 작업하고 뭔가를 찾는다

그건 정말 냄새가 나고, 작업하기가 어렵고, 그건 시험 냄새 야 그래서 뭔가가 있다는 것을 의미하지는 않습니다 항상 누군가가 잘못한 것을 의미하는 것은 아닙니다

그러나 그것은 냄새가 난다 그래서 그 예가 Martin Fowler는 아이가 있다면, 아기, 그리고 너 필요해 언제 아기 기저귀를 갈아 입으셨습니까? 그가 얻은 충고는 글쎄, 기저귀가 냄새가 나면 바꿔야 해 따라서 테스트 냄새의 원리도 여기에 적용됩니다 따라서 테스트가 진행되거나 코드가 작동하기 어려운 경우, 그것을 변경하십시오

그래서 나는 시간 때문에 모든 시험 냄새를 맡지 않을 것이다 그러나 나는 여기에 슬라이드를 남겨 뒀다 그리고 마침내, 마지막에는 슬라이드에 대한 참조를 드리겠습니다 그래서 당신은 나중에 그것을 볼 수 있습니다 따라서 팀에서 단원 테스트를 수행하는 경우, 아마 이것 좀 봐

거기에 좋은 충고라고 생각되는 것들이 있습니다 내가 다른 사람들에게서 뽑은 것은 내 것이 아니야 동기 부여, 그래서 이것은 재미있는 부분입니다 사실, 아직 그걸 보여주고 싶지 않아 이 사진을 보겠습니다

이 그림은 다리입니다 나는 내 친구에게서 이것을 얻었다 당신이 외딴 지역에 있다고 상상해보십시오 다리는 나무로 만들어져 있습니다 주위에 나무가 많이 있습니다

다리는 대부분 보행자의 교통량 일 수 있습니다 그것은 지나가고있는 다리처럼 보입니다 큰 동굴이나 협곡 같지 않아 만약 누군가가 다리에서 떨어지면 그들은 심하게 다쳤습니다 그것은 상대적으로 안전한 지역입니다

준비에 몇 달을 소비하는 것이 얼마나 소중한가? 여기에 강철 다리를 짓는 돈이 많이 들었 니? 글쎄, 아마 강철은 풍부하지 않을거야 어쩌면 쉽지만, 이 나무 다리에있는 보드가 마모 된 것처럼, 그들은 그것을 쉽게 대체 할 수 있습니다 그래서 나는 허구 적 시나리오처럼 그림을 그리는 것과 같습니다 나는 그것이이 다리에 실제로 사실인지 모른다 단위 테스트는별로 가치가 없을 것입니다

또는 적어도 그것은 더 낮은 가치를 가질 것이다 그 영향과 비용이 낮기 때문입니다 나를 참아주십시오 그 시나리오를, 말하자면, 시카고 다운타운의 한 다리 2 층 교량 인 경우 보행자 교통량이 있습니다 낮은 수준의 차량 통행량, 그 위에는 L 열차가 있습니다

L 기차 또는 CTA에는 75 만 명이 있습니다 매일 평균 이상으로 이동합니다 실패하면 큰 영향을 미칩니다 되살아 난 볼트 하나가 있다면 이 다리에서 실패를 일으킨다 엄청난 거래 야

그렇지? 그래서 제가 페인트하려고하는이 두 시나리오에서, 시나리오가있는 것 같아 단위 테스트는 높은 영향력과 많은 가치를 지니고 있습니다 나는 그렇지 않은 것들이 있다고 생각합니다 그 비유가 효과 있다고 생각한다면 의견을주세요 그것은 제가 작업 해 온 것과 같습니다

그 첫 번째 사진에서, 나는 반드시 그것을 가로 질러 나의 차나 트럭을 운전하지 않을 것이다 나는 뛰쳐 나와 위아래로 뛰어 올랐다 (조 웃음) 나는 그것을 pretest했다 훨씬 저렴한 테스팅 이죠, 그렇죠? – 그래 – 저기 나가서 봐

– [Joe] 네, 그래서이 다리를보고 있습니다 나는 반드시 내 차를 운전하지 않을 것이다 – 테스트 할 때까지 – 네, 시험을 마칠 때까지 하지만 정말 싸게 – 그래, 맞아

네, 이전에 보여 줬던 기차 테스트처럼 당신이 물건을 만드는 것처럼 그것을 가로 지르는 열차를 타고 무엇이 일어나는 지보십시오 내가 너와 함께했다면, 너는 말할거야 헤이 마이크, 나가 (청중 웃음) 그리고 네가 돌아 오면 우린 운전할거야 (청중 웃음) – [Joe]하지만 다른 방법으로 철자를 쓰도록하겠습니다

그래서 비유를 뛰어 넘으십시오 세 규칙, 세 클래스가있는 경우 또는 특정 단위를 사용하는 코드의 세 영역 단위 테스트에는 많은 가치가 있습니다 도서관을 쓰고 있다면, 뭔가 쓰고 있다면 다른 사람들은 작곡가 인 JSON에서 사용하고 있습니다 단위 테스트를 부탁드립니다 리팩터링 할 기존 코드가있는 경우, 단위 테스트를 통해 확실한 결과를 얻을 수 있습니다

당신이 리팩토링 할 때 당신이 일을 깨뜨리지 않고 있다는 것을 필요한 복잡성이 너무 많으면 그래서 암호화, 압축, 특정 알고리즘, 아마도 정렬 알고리즘, 때로는 코드가있다 그것은 실제로 감 결합하지 않습니다 단위 테스트는 많은 가치를 가질 것입니다 왜냐하면 당신은 더 간단한 부분으로 그것을 분해 할 수 없기 때문입니다

탐색 적 작업, 테스트 중심 개발, 앉기를 강요하는 데는 많은 가치가있을 수 있습니다 단위 테스트를 작성한 다음 단위를 작성하십시오 테스트를 구현하거나 테스트를 통과시킵니다 시카고의 다리로 돌아가서, 아주 사소한 버그에 대한 비용이 너무 많이 든다면, 단위 테스트는 많은 가치를 가질 것입니다 프레임 워크에서 작성하는 경우, 그래서 이것은 다소 비슷합니다

작곡가 의존성이 있다면, 프레임 워크 코드가 견고하다는 것을 확인하고 싶습니다 언제 가치가 낮습니까? 글루 코드를 쓰고 있다면 그래서 글루 코드를 보는 것은 마치 글쓰기를하는 것과 같습니다 어쩌면 테마 훅이나 드루팔 (Drupal) 나는 많은 가치가 있다는 것을 모른다 그 단위 테스트

네가 정말로 신경 쓰는 것은 네가 생각할 수 있기를 바라는거야 드루팔 (Drupal이 그 일을하고 있음, 그리고 당신은 뭔가를 연결하고 있다고 프레젠테이션이 정확하도록 그 시나리오에서, 당신은 아마도 더 많은 가치가 있습니다 상위 레벨 테스트에서 당신이 복잡하지 않은 것 같아서요 당신이 작성한 코드 단위로 몇 가지 예외가 있지만 폭 넓은 스트로크, 글루 코드를 쓰고 있다면, 단위 테스트는 아마도 가치가 낮습니다 유지 보수 비용이 훨씬 높습니다

버그 비용보다 일부 웹 사이트에도 적용됩니다 플랫폼에 코드를 작성하고 있습니다 이것은 아마도 첫 번째 것과 유사 할 것입니다 하지만 난 그저 그렇게 말하는 것 뿐이야

코드를 작성하여 함께 묶는 경우, 당신은 아마 더 많은 이익을 얻을 것입니다 단위 테스트보다 통합 테스트 더 가치있는 형태의 테스트가 있습니다 통합 또는 UI 테스트 독방 또는 사교적

나는 이것을 여기에 던져야했다 너무 사교적 인 단위 테스트, 제 생각 엔 – (웃음)

– 나는 도움이된다고 생각한다 이 이미지는 누군가 만들어졌습니다 이 캐비닛, 그리고 서랍을 끝까지 열 수는 없습니다 캐비닛이 구석에 있기 때문에 서랍은 서로 대립한다 극단적으로 테스트했을 수도 있습니다

이 서랍 하나 하나 하나씩, 하지만 물건들을 모을 때까지 그것을 조합 해 보았습니다 그 단위 테스트는 쓸모가 없었습니다 나는 쓸모 없다고 말하지 않을거야, 너무 가혹한데, 그러나 그들은이 문제를 드러내지 않았다 전체 응용 프로그램이 함께 작동 할 때 이것이 사교적 인 테스트의 가치 중 하나입니다 하지만 디버깅하기가 어렵습니다

많은 설정과 해체가 필요합니다 데이터베이스가 필요할 수도 있습니다 그것은 많은 테스트 복식을 필요로합니다 혹시 Drupal 8에서 KernelTest를 써야한다면, 내게 무슨 말을하는지 알게 될거야 사교적 인 테스트는 어려울 수 있습니다

독방, 더 높은 부호 적용을 허용하고, 따라서 테스트중인 시나리오를보다 효과적으로 제어 할 수 있습니다 디커플링을 촉진합니다 우리가 겪은 예를 기억하십시오 우리는 분해되었고 물건을 나눠 줬다 더 쉽게 테스트 할

더 빠르게 실행되고 더 나은 소프트웨어 설계가 가능합니다 사이먼 하니웰 (Simon Honeywell) PHP의 함수형 프로그래밍, 그는 나에게 푹 빠져있는 말을했다 과소 평가해서는 안됩니다 얼마나 쉽게 이러한 기능, 그는 순수 함수를 언급하고 있습니다 테스트가 더 쉬워진다

그들의 국가 채워진 대조 물보다는 따라서 코드를 작성하고 테스트 할 수 있기를 원할 때, 공유 된 상태와 부작용을 피할 수 있는지 고려하십시오 독방 단원 테스트 좋은 코드를 작성해야합니다 당신이 Lorax의 이야기를 안다면, 이 지역에 들어오는 한때의 한 마리가 있습니다 많은 자원을 가진 그는 건축하고 건축하고 건축하고, 근본적으로 거기에있는 모든 자원을 파괴합니다

Lorax는 그에게 간청하면서 이렇게 말했습니다 "보세요, 당신이 생산에 집중하고 있다는 것을 알고 있습니다 "코드 작성에 주력하고 있습니다 "그러나 멈추지 않는 한 "코드를 릴리즈로 로빙, "당신은 앞선 것일 수 있습니다 "귀하의 코드에있는 문제의 심각한 영향

" 과 Lorax는 말한다, "너 같은 사람이 지독히 많은 것을 신경 쓰지 않는다면, "아무것도 나아질 수 없다 그렇지 않다" 단위 테스트에 대해 이야기하는 것은 대단합니다 소프트웨어 품질에 대해 이야기하는 것이 좋습니다 하지만 궁극적으로 코드에 가까운 사람들, 개발자 그것을 말하십시오

그래서 Lorax의 이야기에서, 나무에는 방언이 없다고합니다 코드 자체는 말하지 않습니다 당신은 모두 코드의 전문가입니다 쉬운 예, 내 친구, 그는 나에게 슬랙 메시지를 보냈다 그는 "이것이 Drupal 8이 좋은 이유입니다

"라고 말했습니다 그리고 그는 누군가를 언급하고있었습니다 누가 코드 제출을 되풀이했다 "이것은 단순히 맹목적인 커밋을위한 너무 많은 코드입니다" 지원 의견은 도움이되지 않습니다

테스트가 필요합니다 이거 야 이것은 Lorax 모자가 작용하는 곳입니다 당신은 정말로 차이를 만드는 사람입니다 당신이 코드베이스를 가지고 있다면 그리고 당신은 어디서부터 시작해야할지 정말로 모른다

나는 약간 제안을 줄 것이다 이것은 실제로 같은 프레임 워크에 적용됩니다 단위 테스트가 높은 가치를 갖는 곳 PhpMetrics라는 도구가 있습니다 이 그래프의 경우 실제로 이전 버전을 사용했지만, 이 차트를 생성 할 수 있기 때문에 여기서 y 축을 따라 순환 복잡성을 보여줍니다

순환 적 복잡성 (Cyclomatic complexity) 본질적으로 함수를 통해 얼마나 많은 경로가 있는지, 따라서 코드가 얼마나 복잡한 지 측정 할 수 있습니다 원추형 커플 링은 x 축을 따라 이루어지며, 이것은 얼마나 많은 의존성이 존재 하는지를 의미합니다 당신이 일하는 단위로 더 많은 의존성을 가질수록, 네가 필요로하는 복식이 많을수록 독방 검사를하고 싶다면 나는 드루팔 (Drupal 8)에 대한 분석을 한동안 해왔다 이것은 Drupal 8

6에 있습니다 83 이후이 그림은 많이 바뀌지 않았습니다 하지만 나는 몇 가지 것을 부르고 싶다 엔티티 관련 클래스가 있습니다

높은 복잡성과 많은 결합력을 가지고 있습니다 나는 그것들이 좋은 예라고 생각한다 그걸보고 싶을지도 모릅니다 말하자면, 우리는 이것을 분리하고 싶지 않습니다 너무 복잡해서이 수업을 계속 진행하고 싶습니다

하지만 내가 말하는 것은 당신이 지역을 찾고 싶다면 단위 테스트가 높은 가치를 가질 수있는 곳, 높은 복잡성, 많은 커플 링, 단위 테스트의 경우, 잠재적으로 그들을 분해하고 분리시킨다 그러면 더 명확한 주장을하는 데 집중할 수 있습니다 그리고 코드가하는 일에 대한 가정 네, 그리고 몇 가지 다른 예를 들려 드리겠습니다 폼 빌더가 있습니다

ArchiveTar는 매우 복잡한 클래스입니다 거의 커플 링이 필요 없기 때문에, 그것은 많은 다른 수업에 의존하지 않고, 그러나 높은 복잡성, 아마도 모든 압축 작업이 그 원인 일 것입니다 그러나 당신이 그것을 본다면, 그것은 하나의 큰 파일과 같습니다 그걸 깨뜨리는 것이 도움이 될지도 몰라 당신이 단위 테스트 수 있도록 별도의 파일에

심포니, 예 – 5 분 – 5 분, 오케이 좋아, 거의 끝났어 Symfony는 재사용에 성공했습니다

다른 프레임 워크와 플랫폼으로 돌아 가면, Drupal처럼 일부 Symfony 구성 요소를 사용하고 있습니다 Symfony가 왜 재사용이 성공 했나요? 나는 진실과 같은 말은 아니다 하지만 몇 가지 관찰이 있습니다 좋은 객체 지향 코드입니다 Symfony 클래스 중 일부를 읽으면, 그들은 꽤 깨끗합니다

당신이 그것을 보는 너무 많은 경우가 아니라 너는 단지 너의 손을 내밀어 버린다 당신은 그것에 익숙하지 않을지도 모르지만 ArchiveTar를 좋아하지는 않을 것입니다 놀랄 일도 아니고 테스트는 주로, 전체적으로는 아니더라도 독방 단원 테스트 전부는 아니지만 커널 테스트가 있습니다 하지만 더 독방적인 테스트를했는지 궁금합니다

우리의 프레임 워크와 라이브러리가 많은 이점을 얻는다면 그래서 두 가지 원칙을 기억하십시오 테스트 복식, 독방 대 사교성 고맙습니다 의견을 제공하십시오 이 세션 평가

여기에 슬라이드 링크가 있습니다 내가 다시 올게 기부의 날은 토요일입니다 기여할 코드를 알 필요가 없습니다 우리는 Drupal 9 준비 작업을 할 예정이며, 그러니 그 일에 동참하십시오

당신이 기부에 처음이라면, 정오 10시에 AmyJune의 훈련이 있습니다 우리는 4 분 동안의 질문이 있습니다 네 – 그럼 당신 팀에서 뭘 사용 하죠? 보장을 자동화하는 것을 돕기 위해 적절한 테스트 커버리지를 가지고 있습니까? 그게 당신에게 가장 유용한 것을 찾았습니까? – 따라 달라 – 반복 해 줄래? 질문? – [조] 오, 그래, 고마워, 고마워 나는 보통 기억한다

테스트를 위해 유용한 도구는 무엇입니까? 예를 들어, 테스트 커버리지를 자동화하기 위해 – [Joe] 테스트 커버리지 자동화? 테스트 커버리지 보고서가 필요한 경우 단위 테스트가없는 코드를 보려면 내가 사용했던 커버 올스 (Coveralls)라는 서비스가 있습니다 나는 다른 사람들이있을 것이라고 확신한다 누구든지 테스트 커버리지 보고서 도구를 알고 있습니까? 그게 제가 전에 사용했던 것입니다 나는 다른 사람들이있을 것이라고 확신한다

나는 CircleCI라고 생각한다 CircleCI는 Travis와 비슷합니다 클라우드에서 빌드 테스트를 수행하는 것과 같습니다 나는 그들이 그것을위한 도구를 가지고 있다고 생각합니다 다른 질문? 의견, 반대? 괜찮아

그래, 그래 – 어떤 종류의 문제가 있었 니? 예를 들어, 당신은 더 많은 단위 테스트를 수행하려고하는 것과 같습니다 또는 어떻게 다루는가? 예를 들어, 당신은 마감 기한이 끝난 프로젝트가 있다면, 그리고 당신은 프로젝트 매니저처럼 말합니다 이 물건을 가져와야 해 하지만 모든 단위 테스트를 수행하는 데 시간이 걸리고 싶습니다

이것을 퍼뜨리는 것 어떻게 – [조] (한숨) 내가 가진다면

(웃음) 그래서 질문은 노력한 경험이있는 문제, 마감 기한이 있지만 단위 테스트를해야합니까? 내가 그것에 대한 답을했다면 나는 그것을 나눌 것입니다 (청중 웃음) 네가 가진다면 나는 마이크를 빨리 잡을 것이다 나는 단지 intuit이다

– [조] (웃음) 내가 찾은 것은, 이해 관계자가 체중을 측정해야합니다 너는 선택권이있다 당신은 이해합니다, 그것은 Lorax와 같습니다, 그것은 일회성 (Once-ler)과 같습니다 이 일을 추진하고 싶다면, 하지만이 관습을 희생해야합니다 우리가 오염을 통제하는 데 도움이 될 것이라고 믿는 우리의 코드베이스에서, 또는 잘못된 것들, 그것은 우리가 버그를 뿌리 뽑을 수 있도록 도와 줄 것입니다

마이크가 같은 줄을 따라, 애자일을 사용하지 않는다면, 고려해보십시오 당신이 그 과정을 시작하면, 민첩한 방법론으로 프로세스를 시작한다면 테스트는 각 스프린트에 내장되어 있습니다 이해 관계자가 프로세스에 참여하게합니다 그들은 스프린트 계획 회의에 참석한다

그들은 스프린트 리뷰에 대한 책임이있다 그들이 품질의 부족을 본다면, 그들이 시험 계획의 부족을 본다면, 실제 결과 대비 예상 결과에서, 그들이 단위 테스트의 부족을 본다면, 그들은 뒤로 물러 설 것이며 사람들이 더 많이 말하도록 도울 것입니다 많은 것은 팀에 달려 있습니다 당신은 팀을 얻어야합니다 모두가 선상에 있어야합니다

– [Joe] 그래서 마이크가 말했습니다 제가 이것을 잘 요약하면, 그 민첩한 방법론이 여기에서 도움이 될 것입니다 각 스프린트 리뷰에서, 그들은 테스트 커버리지를 가지고 있는지 아닌지를 볼 수 있습니다 그들은 무게를 달아 말할 수 있습니다 스프린트로 스프린트로 무게를 달다 테스트에 더 많은 시간을 투자해야하는지 말하십시오

– 끝날 때까지 시험을 그만 두지 마세요 그래 [조] 그래 알았어, 우리는 정각에 있지만 어쩌면 하나는 – – 내가 너에게 따라갈거야 그래, 그래

나와 얘기 해봐 나는 트위터에있어, 나에게 다가 가라 와 주셔서 감사합니다 (경청자는 박수 갈채한다) ClarityPartnerscom에 의해 가능한 자막 시카고 지역 Drupal 고문

PHP-Training mit PHPUnit und der Funktastatur bei Flyeralarm mit dem Codeception Framework

안녕하세요 여러분, Flyeralarm에서 우리는 오늘 롤랜드에서 교육을 받았고 우리와 함께했습니다 사실상 모든 것을 처음부터 끝까지 테스트 한 코드 작성, 우리에게 주셨다

그리고 그것은 정말로 좋은 물건이었습니다 Roland의 교육에 대해 정말 멋진 점은 실제로 매번 코덴이옵니다 무선 키보드가 내 손에 들어올 때마다 나는 다시 그것을 할 것입니다 안녕하세요, 테스트를 위해 PHP 교육을 받고 싶다면 여기를 살펴보십시오 아래 동영상 설명을 참조하십시오

거기에 그것은 훈련에 대한 블로그 게시물로 이동합니다 동영상을 좋아했습니다 채널을 따르십시오

Creating Components – PHP Standard and Best Practices Part 12

지금까지이 과정에서 우리는 정말 간단한 애플리케이션을 구축 해왔다

그들은 모두 인덱스가 PHP로되어 있고 브라우저에서 컴포넌트를 실행합니다 때로는 패키지라고도하며 브라우저에서 실행되지 않습니다 그러나 응용 프로그램이나 다른 구성 요소가 약간 다르게 접근해야한다는 것을 의미하지만 여전히 비슷합니다 간단한 구조로 정말 기본적인 구성 요소를 만드는 방법을 알아 보겠습니다 그런 다음 수업을 작성하는 방법과 수업을 작성하는 방식으로 작동하는지 확인하는 방법을 살펴볼 수 있습니다

먼저 SRC 폴더가 필요합니다 여기에는 모든 코드가 생깁니다 그 안에는 example dot PHP라는 단일 클래스를 만들 것입니다 이것은 구성 요소의 대폭 간소화 된 버전이며 구성 요소에는 아마도 더 많은 클래스가있을 것입니다 그러나 간단하게하기 위해 여기에 코드를 던지게 할 것입니다 그걸 저장해라

여기에 네임 스페이스 treehouse 슬래시 예제에 코드를 넣고 여기 안쪽에 example이라는 클래스를 정의하고 있습니다 그만큼 반복은 많은 패키지가 상호 작용할 하나의 메인 클래스를 가질 것이고 이것은 컴포넌트 자체와 같은 이름이 될 수 있습니다 마침내 7 행에 get something이라는 메소드를 정의하고 있습니다 이 시점에서 간단하게하기 위해 정적 문자열을 반환하는 것입니다 지금까지 브라우저에서 코드를 실행하여 코드 작업을 확인했습니다 응용 프로그램과 달리 우리는이 구성 요소에 대해 인덱스 점 PHP가 없으며 솔직히 우리는 원하지 않거나 필요하지 않습니다

브라우저 코드를 해킹하는 대신 단위 테스트를 사용하고 수동으로 작업 내용을 확인하는 것이 훨씬 더 유용 할 것입니다 자, 단위 테스트는 다른 과목에서 잘 다루는 커다란 주제이지만, 여기서는 기초를 확실히 다룰 수 있습니다 PHP 유닛을 dev 종속으로 다시 설치해 보겠습니다 작곡가 요구 사항을 사용할 수 있습니다 공급 업체의 이름 인 PHP 단위 및 패키지 자체의 이름과 dev 종속성을 기억하기 때문에 우리는 사람들이 프로덕션 서버에 PHP 유닛을 설치하도록 강요하고 싶지 않습니다 우리는 실행할 것입니다 – if – and dev 및 버전 제약 조건은 point-to-point를위한 것입니다

현재 42 버전이 최신 버전임을 알고 있기 때문에 와일드 카드 우리가 볼 수있는 것은 복합 또는 JSON이 생성 된 것입니다 그리고 그것은 모든 PHP 유닛 의존성 자체와 PHP 유닛 25를 위해 설치되었습니다 완전한 이 코드를 공개 할 생각이라면 작곡가 패키지의 아주 초기 단계입니다

다른 몇 가지가 있습니다 우리는 먼저 생각해야합니다 다음으로 코드의 품질을 향상시키는 몇 가지 표준을 살펴 보겠습니다

PSR2 – PHP Standard and Best Practice Part 14

이것은 psi1보다 논란의 여지가있는 권고입니다 널리 사용되고 채택 된 PS r2는 널리 사용되지만 일부 개발자는 다른 개발자보다 더 만족 스럽습니다 여기에서 추론은 스타일 가이드로서 PS r2이며 각 개발자는 스타일에 관해서는 그들 만의 고유 한 선호도를 가지고 있습니다 PS r2를 사용하는 개발자의 개인적인 선호도에 관계없이 코드에 많은 이점이 있습니다 모든 사용자가 단일 코드 스타일 가이드를 준수하도록합니다

제 3 자의 버전 관리 및 공동 기고와 관련된 모든 종류의 애매한 문제를 피하는 데 도움이됩니다 팀에서 팝업으로 나타날 수있는 잠재적 인 주장을 중지하기 위해 작업 할 때 따라야 할 일반적인 규칙 세트입니다 브래킷은 PS r2의 기능을 수행 할 수 있습니다 한 번에 개요 하나의 규칙을 살펴보고 그들이 의미하는 바를 설명하겠습니다 코드는 PS r1을 준수해야 PS r2를 준수해야합니다

psi2의 규칙을 따라야합니다 psi2는이 규칙의 맨 위에 추가합니다 코드는 탭이 아닌 들여 쓰기에 강제 기반을 사용해야합니다 이것은 공간 전쟁이 영원히 계속되고 있으며 결코 끝나지 않을 것이라는 대립에 반하는 것입니다 하지만 중요한 것은 일관성입니다

프로젝트가 많을수록 IDE 설정 변경이 적어집니다 PS r2는 무엇을 할 것인가를 결정하는 공간입니다 키보드의 탭 키를 누를 때 좋은 편집기를 최대 네 칸까지 입력하도록 설정할 수 있으므로 문제 선 길이에 하드 제한이 없어야합니다 소프트 한도는 120 자 여야하고 행은 80 자 이하 여야합니다 이것은 단지 멋지다는 것을 의미합니다

코드를 80 자 미만으로 유지했지만 항상 가능한 것은 아닙니다 아마도 120 개를 초과해서는 안되지만 오류가 아니라 경고를 주면됩니다 네임 스페이스 선언 다음에 빈 줄이 하나 있어야하며 사용 선언 블록 뒤에 빈 줄이 하나 있어야합니다 이것은 네임 스페이스 선언 주위에 약간의 공백을 추가하여 꽤보기 쉽게 만듭니다 클래스의 여는 중괄호는 다음 줄로 가야하며 닫는 중괄호는 본문 뒤에 다음 줄로 가야합니다 그것은 단지 클래스에 중괄호를 넣는 것을 의미합니다

메서드의 여는 중괄호는 다음 줄로 가야하며 닫는 중괄호는 본문 뒤에 오는 다음 줄로 이동해야합니다 그들 자신의 줄에있는 메소드에 중괄호를 모든 속성 및 메서드에서 가시성을 선언해야합니다 가시성 및 정적을 선언해야하기 전에 추상 및 최종 선언을해야합니다 약간 혼란스러워 보입니다 하지만 공개적 인 추상적 또는 최종 클래스를 작성하는 경우 추상 또는 최종이라는 단어는 public 앞에 와야합니다 if 정적 클래스를 사용하고 있으며 그 메서드는 public입니다

그런 다음 정적 또는 정적 클래스에 대해 아직 배운 적이없는 정적을 작성하기 전에 public으로 작성해야합니다 이것들은 모두 상당히 진보 된 기능이므로, 지금 당장이 규칙을 무시하는 것이 확실하지 않으면 제어 구조 키워드는 뒤에 공백이 하나 있어야하며 메서드와 함수 호출은 제어 구조 키워드는 if-else 스위치와 같은 것입니다 잠시 동안 그리고이 단어들 뒤에 그리고 여는 괄호 앞에 공백이 필요합니다 제어 구조의 여는 중괄호는 같은 줄에 있어야하고 닫는 중괄호는 본문 뒤에 다음 줄로 가야합니다 이것은 각각에 대한 것이고 키워드와 같은 줄에 중괄호가 있어야하는 것과 같은 것을 의미합니다 그것을 줄을 내려 놓는 대신에 제어 구조의 여는 괄호 뒤에는 공백이 없어야하며 제어 구조의 닫는 괄호에는 공백이 없어야합니다

즉 여는 중괄호 뒤에 공백이없고 닫는 중괄호 앞에 공백이 없음을 의미합니다 이 모든 것이 무엇을 의미하는지 이해하는 것은 상당히 어려울 수 있습니다 PHP 코드 스니퍼라고하는 도구를 설치하면 표준과 비교하여 코드 일치를 테스트 할 수 있습니다 코드 스니퍼가 어떻게 작동하는지 보려면 작업 공간으로 넘어 가자 우리는 PHP 코드 스니퍼로 작업하기를 원합니다

우리는 많은 것들과 같이 설치해야합니다 우리는 여기서 콘솔을 사용할 수 있습니다 유형 작곡가가 요구하다 공급 업체는 squizz labs입니다 패키지 이름 PHP 코드 스니퍼와 다시 한 번, 이것은 dev 종속성입니다 우리는 개발에만 사용하고 생산을 위해서는 사용하지 않습니다

버전 제약 조건을 선택하라는 메시지가 나타납니다 우리는 그렇게 신경 쓰지 않는다 당신은 작품을하는 작곡가가 코드 스니퍼를 설치 한 것을 볼 수 있습니다 그리고 이제는 그곳에 있습니다 이제 PHP 단위와 마찬가지로 실행할 수 있습니다

납품업자 bin 여기는 우리 코드가 살아있는 곳입니다 PHP CS는 코드 스니퍼에 대한 실행 파일입니다 그런 다음 sniff하려는 유일한 디렉토리로 SRC를 인수로 전달합니다 지금 우리는 우리의 테스트와 벤더 폴더를 혼자두고 떠날 수 있습니다 표준 옵션 두 개의 하이픈과 우리는 통과하기를 원한다

PSR 2를 사용하면이 값을 사용할 수 있습니다 왜냐하면 이것이 우리가 이것을 실행한다면 우리가 시험하기를 원하는 표준의 이름이기 때문입니다 코드 스니퍼는 발견 한 내용을 알려야합니다 원본 폴더 안에 존재하는 PHP 파일 중 PSR 2와 호환되는 것은 아닙니다 그리고 발견 된 것을 살펴보십시오

좋아, 여기에 우리가 소스 파일의 예제 PHP 소스 코드에서 찾은 오류가 있습니다 우리가 가지고있는 유일한 파일입니다 여기에 몇 가지 오류가 있습니다 다음은 행 번호입니다 이것은 오류 경고의 심각도입니다

너는 무시할 수있다 오류는 문제이며, 인간이 읽을 수있는 메시지가 설명되어 있습니다 실제로 잘못 됐어? PHP를 사용하는 예제를 살펴보고 그렇게 시도해 봅시다 네임 스페이스 선언 다음에 빈 줄이 하나 있어야합니다 use statement zero가 발견 된 후 하나의 빈 줄이어야합니다

알기 쉽고 선을 긋을 수 있습니다 이 오류 목록을 약간 축소 해 봅시다 좋아, 지금 무슨 일이 일어나고 있니? 여기 클래스의 여는 중괄호는 정의 뒤에 라인에 있어야합니다 좋아요, 정의 선이 바로 여기에 있습니다 그리고 나서 우리는 브래킷에 공간이 있습니다

PS r2는 그 자체가 한 줄에 있어야한다고 말합니다 다시 뛰어 지금 우리는 이러한 오류 중 일부를 제거하기 시작했습니다 이제 클래스 상수는 대문자 여야합니다 foo가 필요하지만 소문자 foo를 발견했습니다 쉬운 수정 이 상수에 대한 참조를 변경하는 것을 잊지 마십시오

예상 기능 ABC,하지만 발견 첫 번째 괄호 사이에 공백이있는 ABC 함수이므로 ABC라는 함수가 없습니다 이는 단지 템플릿 오류 일뿐입니다 잘 그들은 실제로 바로 여기에있는 10 번 줄에 있습니다 거기에 공간이 있어서는 안됩니다

그래서 우리는 그걸 없앨 수 있습니다 이 오류에 대해 몇 가지 더 알려 드리겠습니다 이제는 더 많은 것을 관리 할 시간입니다 그래서 10 번 라인은 여전히이 라인에 문제가 있습니다 우리는 브래킷이 그것을 여기 아래로 호출하는 브래킷을 끼워야합니다

14 우리의 다음 오류입니다 줄 번호가 변경되었으므로 다음을 업데이트하십시오 15 번 줄에 많은 문제가있어 우리는이 코드의 네 가지 다른 오류를 가지고 있습니다 이제 가시성 선언 후에 정적 선언을 찾아야합니다

가시성 선언은 공공 사적이거나 보호되어있어서 정적 인 필요성을 의미합니다 다시 한번, 우리는 같은 메시지 기능을 가지고 ABC 브래킷, 찾을 수 없습니다 ABC 공간 브래킷, 그래서 쉽게 고정 좋아요 15 15 세가 여전히 더 많은 문제가 있습니다 이것은 매우 논쟁의 여지가있는 선입니다 시작 브래킷과 인수 바 1 개가 발견되었습니다

인수 막대와 닫는 대괄호 사이에 예상되는 0 개의 공백이 예상됨을 의미합니다 여기에 공백이 없지만 공백을 하나 찾았습니다 그것은 제로 공간이있을 것으로 예상했으나 발견 한 공간이므로 우리는 여기서 내려다 본다 오프닝 브레이스는 새로운 라인에 있어야한다고 간단합니다 줄을 푸는 것 공백으로 가라

이걸 다시 실행 해 봅시다 좋아요, 공백이 줄 끝을 찾았습니다 그래, 그걸 없애고 몇 여분의 공간이있어 인라인 제어 구조와 익숙한 제어 구조라면 지금 허용되지 않습니다 인라인은 같은 라인에서 모두 일어나는 것을 의미합니다 PHP는 인라인 제어 문을 수행하도록 허용합니다 한 가지 진술 만있는 경우 누군가 문제가 생기면 문제가됩니다

그렇다면 F 내부에서 일어나는 일은 F 내부에서 발생하지 않습니다 이는 혼동을 피하기 위해 매우 혼란 스럽습니다 인라인 제어 구조 만 사용하면 안됩니다 그래, 17 행의 예상 공백은 여전히 ​​문제가있어 그 중 하나를 제거하고 스니퍼에 계속 머물러있어 그래서 우리는 조금의 실수도 남기지 않았다

참 / 거짓 및 null은 소문자 여야합니다 거짓 일 것으로 예상했지만 자본금 F를 발견했습니다 거짓으로 누군가가 이상한 스타일을 사용하여 그것을 바꿨습니다 이제 PHP는 이것을 키워드로 인식합니다 18 번 줄에서 우리는 그것을 볼 수 있습니다

두 개의 공백이 있어야하기 때문에 들여 쓰여지지 않습니다 라인 21 이 공간을 없애 버려야합니다 21 참 거짓 그리고 다시 소문자 여야합니다 대신 누군가가 대문자 잠금을 사용 했으므로이를 바꿀 수 있습니다

스니퍼를 다시 만나러 가자 나는 지금 우리가 거기에 들어가는 1 개의 스크린에 맞을 것이다 이 줄은 function 키워드 다음에 하나의 공백이 있어야합니다 좋아, 익명의 기능 키를 사용하여 공간을 넣을 때 함수를 사용할 때 또한 30 개의 닫는 버팀대는 그 자체로 선상에 있어야합니다, 알았죠? 파일 끝에 하나의 새로운 줄이 생기면 각 PHP 문은 그 자체로 정렬되어야합니다 아직 문제가 있습니다

이제 파일이 끝날 때 새 행 하나가 0이 될 것으로 예상됩니다 괜찮아 빈 줄이있다 클래스의 닫는 중괄호는 그 다음에 어떤 줄을 의미합니까? 클래스의 닫는 괄호는 몸체 끝 부분에 있어야합니다 그 줄을해라

완벽한 모든 오류가 사라졌습니다 많은 ID와 코드 편집기는 코드 스니퍼가 내장되어 있거나 플러그인으로 사용할 수 있습니다 코드 스니퍼와 같은 대화 형 도구를 사용하면 PS r2에 대해 실제로 배우는 데 도움이됩니다 자신의 프로젝트에서 PS r2를 항상 따라야 할 필요는 없지만 그렇게하는 것이 점차 일반화되고 있습니다

Why we need Testing of Code | Code Testing #1

코드를 작성한 적이 있습니까? 하나의 버그를 수정하면 새로운 코드가 생성됩니다 버그가 발생하여 코드 테스트가 필요하므로 정확히 무엇이 필요한지 알아 보겠습니다

코드 테스팅은 왜 필요하며 우리는 실제로 그것을 테스트해야합니다 만약 당신이 테스트 목적을 위해 코드를 작성하고 있거나 테스트하지 않았다면 당신은 브라우저를 열어서 테스트 할 폼을 만든다 브라우저에서 해당 양식을 볼 수 있으면 코드가 올바르다 고 말할 것입니다 양식에 대해 썼다면 정확합니다 그 변수를 원한다면 아마 당신이하는 일을 할 수있는 변수를 가져야합니다

4 ~ 5 라인 이후에 사용 가능하다면, Ver_dump를 사용하게 될 것입니다 PHP 세계 또는 그냥이 함수를 반환하고 그냥 볼 것이다 아마도 콘솔에 있지만 그 특정 변수는 4 줄 이후에 가치가 있거나 5 라인 또는 아닙니다 그래서 우리는 수동 테스트와 인간을 항상 말할 수 있습니다 우리가 테스트를 작성하는 이유는 테스트를 작성하지 않으므로 실수를하는 것입니다 당신은 분명히 버그를 가지고 있으며 버그를 의미합니다 버그 란 오류나 모든 종류의 것을 의미합니다

코드에 대한 테스트를 작성하지 않고 코드를 작성하면 문제가 발생합니다 매우 중요합니다 따라서 테스트를 작성한 것과 같습니다 코드를 입력하면 프로그램이 작동합니다 그렇지 않으면 첫 번째 프로그램으로 이동해야합니다

포인트는 테스트를하지 않는다는 것을 의미합니다 버그가 없다면 100 % 확신 할 수 있습니다 글쓰기 테스트에 버그가 있지만 수동으로이 작업을 수행하는 경우 하나의 버그를 수정 한 결과는 적어도 새로운 책이 될 것이고 나는 여기에 적었습니다 적어도 한 가지만 고치면 적어도 우리는 그것을 발견 할 것입니다 5 10 20 가지를 바꿀 것이고 당신은 좋아할 것입니다

당신은 사물이 어떻게 연결되어 있는지 기억하지 못하기 때문에 이것이 중요한 포인트입니다 수작업 테스트에는 많은 시간이 걸리기 때문에 큰 것을 가지고 있다면 프로젝트를 수동으로 테스트하는 경우 전체 코드를 다시 테스트 할 수 없습니다 수동으로 나는 당신이 소프트웨어 프로젝트 전체를 테스트 할 수 없다는 것을 확신 할 수 없다 너무 많은 기능이 너무 많기 때문에 수동으로 무엇이든간에 모듈은 많은 부분이 포함되어 있으므로 시간이 많이 걸릴 것입니다 코드 작성에 썼지 만 자동 시스템이 있다면 어떨까요? 당신을 대신해서 테스트 할 수 있습니다

즉, 코드를 처음 작성하는 것입니다 그런 다음 모든 것이 테스트에 의해 처리되고 테스트와 모든 것을 실행합니다 코드가 다른 코드를 테스트한다는 것을 의미하는 작성된 코드로 테스트하려고합니다 코드 그래서이 프로젝트에 대해 생각하고 프로젝트 비용은 매우 의존합니다 테스트에서 코드에 대한 테스트를 작성하지 않았다면 이 그래프 크기와 비용은 그 시간이 될 수있는 돈이 될 수 있습니다 당신의 프로젝트와 그래프에 대해 당신이 제공 한 노동 또는 열심히 일할 수 있습니다

프로젝트 크기가 작 으면 여기에서 어떤 일이 일어나고 있는지 알 수 있습니다 코드 크기에 대한 테스트가 없으므로 비용이 적다는 것을 기억하십시오 또한 작고 분명히 그리고 만약 당신이 테스트를 작성하지 않은 경우 괜찮을거야 크기가 작기 때문에 수동으로 테스트 할 수 있습니다 여러 번이나 프로젝트의 크기로 비용이 증가합니다 왜이 크기의 프로젝트가 증가하는지 생각하기 때문에 증가합니다 그러면 수동 테스트가 필요합니다

수동으로 테스트하는 경우 작성된 ​​테스트 코드가 없습니다 이것은 확실하게 그것은 시간이 걸릴 것이고 시간은 돈이라는 것을 알기 때문에 돈이됩니다 시간이 없어졌고 분명히 당신이 누군가가 필요하다는 것을 테스트하기 위해 열심히 노력합니다 테스트를 위해 기능별로 이동하십시오 버그가있는 경우 다음을 수행해야합니다

그것을 해결하고 각각을 테스트해야하므로 비용이 극대화됩니다 이렇게 다른 방법으로 생각해보십시오 테스트를 다시 작성하면 무엇을할까요? 크기와 비용 효과가 될 것이므로 다시 그래프 크기와 비용 측면에서 돈 시간과 노동의 크기가 정당하다 프로젝트가 증가하고 프로젝트의 테스트 크기를 작성했음을 기억하십시오 증가하면 비용이 줄어들고 원하는 것이 바로 그 것입니다

테스트를 한 번 작성했기 때문에 돈 시간 노동에 드는 비용 그런 다음 매번 변경 사항을 수행 할 때마다 방금 실행 한 코드가 실행됩니다 하나의 명령을 사용하면 문제가있는 곳을 정확히 파악할 수 있습니다 모든 것을 테스트 할 시간이 없다는 것을 고칠 수 있습니다 소프트웨어 또는 테스트 도구를 사용하고 프로젝트 크기가 매우 큰 경우 작은 예 테스트를 작성할 수 있지만 테스트가 필요한 이유는 간단한 블로그 일뿐입니다 더 작은 프로젝트라도 테스트를 작성하는 것이 좋습니다

프로젝트의 나중에 더 커질 수 있으므로 비용을 줄이기위한 테스트를하는 것이 좋습니다 증가하지만이 정도는 아닙니다 나는 이것을 이렇게 좋아해야한다고 생각합니다 당신이 말할 필요가있는 지점을 얻을 것 같아서 시작해야합니다 정확한 코드 또는 정확히 쓰고 싶은 프로그램에 대해 코드를 두 번 쓰십시오

코드에 대한 두 번째 네 말이 맞아요 그러나 이것은 더 깊은 것을 줄입니다 네가 초기 목적을 위해 네가 말했듯이 네가 좀 더 시간이 좀 걸릴거야 프로젝트를 진행하면서 테스트 생일을 쓸 시간은 줄어 듭니다 당신의 깊은 시간, 나는 당신이 나중에 시험을 치는 지 확실히 확신합니다

자존심을 자랑스러워 할 것입니다 실제로이 테스트는 실제로 인간의 최고의 직업을 피합니다 이것은 실수이며,이 실수를 보도록하겠습니다 분명히 알고 있다면 당신의 프로그램은 당신을 깨뜨리지 않을 것입니다 자신감을 키우고 말할 것입니다

확인이 프로젝트를 받아이 응용 프로그램과 매우 휴식을하지 않을 것이라고 확신 나는이 코드들에 대한 테스트를 작성했기 때문에 이것은 실제로 여러분이 작성한 이유입니다 테스트를 작성하는 방법은 테스트를 작성하는 방법으로 알려진 입력 및 출력을 테스트하고 간단한 팁은 테스트를 작성할 때마다 알려진 테스트 만하는 것입니다 출력 곱하기에 2를 곱한 결과가 2라고 가정합니다 네가 네가 알지도 못하는 건 21 점 2 5 6 배가되었지만 29 점 5 5 5 네가 그렇지 않다는 것을 모르는 이유는 계산기를 사용하여 입력 및 출력을 단순화하여 테스트 할 수 있습니다 확인하고 다음 포인트는 빠른 테스트를 먼저 실행하고 느린 테스트를 실행하는 것입니다

당신이 데이터베이스 테스트를 다루는 경우에는 시간이 오래 걸립니다 한번의 테스트가 3 초에서 4 초 정도 걸리면 테스트하고 그 테스트는 항상 통과해야합니다 마지막 50 번째 테스트에서 버그가 있습니다 이것은 단순한 라우팅 문제 일뿐입니다 당신은 당신이 이것을 알기 때문에 그 모든 시간을 기다려야합니다

좋지만 시간이 걸리는 이유는 첫 번째 테스트 테스트를 먼저 실행하지 않는 것이 좋습니다 마지막으로 가장 느린 것입니다 그래서 이것들은 당신을 소개 할 수있는 간단한 것들입니다 다음 에피소드의 코드 테스팅에서는 단위 테스팅과 왜 우리가 필요한지를 보게 될 것입니다 그것과 정확히 무엇이며 당신은에 대한 설명에서 링크를 찾을 수 있습니다 다음 비디오 또는 우리가 PHP 단위를 할 것입니다 그 테스트의 전체 시리즈에 대한 우리는 또한 브라우저 테스트에서도 레벨 테스트를 진행할 것입니다

이 시리즈는 재미 있기 때문에이 채널을 구독하십시오 가입 한 후에 벨 아이콘을 누르는 것을 잊지 않으므로받을 수 있습니다 새로운 비디오를 업로드 할 때마다 알림은 좋아하지만 영화는 깜빡하지 않습니다 Facebook Twitter와 Instagram에서 우리는 그 다음 에피소드에서 만날 것입니다 안녕

Impersonating Users in Laravel And Example of TDD using PHPUnit

안녕 얘들 아, 우리 채널에 오신 것을 환영합니다 오늘은이 비디오에서 가장 한 사용자에 대해 이야기하겠습니다

프로젝트의 상황을 고려하십시오 사용자가 설명 할 수없는 상황이 발생합니다 이러한 상황에서 문자 그대로 흉내낼 수 있다면 유용합니다 로그인 자격 증명을 쓰지 않고 계정에 로그인하고 다음 작업을 수행하십시오 그들을 대신해서

또는 사용자가 오류가 발생하면 자신의 오류를 볼 수 있습니다 이 동영상에서 개발할 데모 앱은 다음과 같습니다 이미 Harish라는 관리자 계정으로 로그인하고 있습니다 관리자 슬래시 가장 자리 페이지로 이동합니다 여기서 우리는 다른 사용자의 이메일 주소 (예 : john@example

com)를 입력 할 수있는 간단한 양식을 가지고 있습니다 클릭 할 때 가장 버튼을 클릭합니다 자, 이제 우리는 그 이메일 주소를 사용하여 로그인했습니다 이제 우리는 자신이 필요한 모든 것을 할 수 있습니다 여기서 버튼을 가장하는 것을 중지했습니다

이제이 버튼을 클릭하면 관리자 계정 Harish로 다시 전환됩니다 이 기능을 개발하기 위해 PHPUnit 테스트 케이스도 작성합니다 따라서이 채널을 처음 사용하는 경우 앞으로 이동하기 전에 빨간색 가입 버튼을 누르십시오 벨 아이콘을 누릅니다 따라서 곧 출시 될 비디오를 놓칠 수 없습니다

이제 시작하겠습니다 먼저, 새로운 Laravel 프로젝트를 만들 것입니다 가장이라는 이름을 지어 봅시다 다음으로 cd 가장합니다 이 프로젝트를 편집기에서 엽니 다

이제 우리는 dot env 파일로 데이터베이스를 구성 할 것입니다 이미 mysql에 데이터베이스를 만들었습니다 그래서, 여기서 데이터베이스 이름은 가장이고, DB 사용자 이름은 qirolab이고 암호는 비밀입니다 터미널에서, 나는 php artisan을 실행하여 빠른 인증을 생성하는 인증을한다 발판

다음으로 우리는 PHP artisan migrate를 실행하여 데이터 베이스 다음 단계는 테스트 케이스를 위해 phpunitxml 파일을 구성하는 것입니다 아래쪽에서 데이터베이스 자격 증명을위한 환경 변수를 추가 할 것입니다 여기에 DB_CONNECTION sqlite를 추가 할 것입니다

config databasephp 파일이 보이면 여기 sqlite, 우리는 DB 데이터베이스를 추가해야합니다 그래서 phpunitxml에서 우리는 메모리에 DB_DATABASE를 추가 할 것입니다 테스트를 실행하기 위해 일반적으로 SQLite in-memory 데이터베이스를 사용합니다

테스트를 위해 데이터베이스의 트랜잭션, SQLite 메모리 내에서 이러한 트랜잭션 수행 매우 빨라서 몇 초 안에 수백 건의 테스트를 수행 할 수 있습니다 이제 모든 기본 구성이 완료되었습니다 이제 우리는 사용자 기능을 가장하려고 시도 할 것입니다 시험을 치러 시작할 것입니다 당신은 우리가 ExampleTest

php 파일을 가지고 테스트 기능에서 볼 수 있습니다, 그럼, 이것을 삭제하자 Unit 디렉토리에서 ExampleTestphp 파일을 볼 수도 있습니다 이것도 삭제하십시오 다음, 터미널에서, 나는 PHP를 장인이 테스트를 가장 할 사용자 테스트를 실행합니다 그것은 테스트 기능 디렉토리에 ImpersonateUserTest

php 파일을 만듭니다 상상할 수있는 것처럼, 이와 같이 사용자가 로그인 할 수있는 엔드 포인트를 노출하면 사용자라면이 끝점이 확실히 보호되어야합니다 관리자 만 열 수 있습니다 이를 위해 관리자가 아닌 사용자가 가장 할 수없는 페이지를 만들 수 없습니다 이제 우리가 손님이라면 관리자 슬래시에 액세스 할 수있는 권한이 없습니다

엔드 포인트를 가장하려고합니다 따라서 관리자 슬래시를 가장하려고 시도하면 가장 할 수 있습니다 로그인 페이지로 리디렉션됩니다 이제 이것을 테스트하기 위해 터미널에서 우리는 공급 업체 bin phpunit, 내 터미널에서 필자는 PHPUnit 별칭을 만들었습니다 따라서이 긴 경로를 실행하는 대신 PHPUnit을 실행할 수 있습니다

여기에 응답 상태 코드 [404]가 예상대로 생성됩니다 끝 점이 아직 없습니다 이제 webphp로 이동하여 여기에 경로를 추가하겠습니다 경로는 관리자가 가장합니다

나는 항상 Admin 네임 스페이스에 관리 경로를 추가하려고합니다 여기 컨트롤러는 Admin ImpersonateController @ index입니다 이제 PHPUnit을 다시 실행하면 500 개의 상태 코드가 생성됩니다 그러나 그것은 어떤 오류에 대한 피드백을 표시하지 않았습니다 그럼, 우리가 뭘할지, 여기 전화 할게

이것은 예외 처리 방법이 없습니다 PHPUnit을 다시 실행하십시오 이제 문제에 대한 적절한 피드백을 얻었습니다 이 가장 컨트롤러는 존재하지 않습니다 나는 항상 예외 처리없이 우리의 테스트를 좋아한다

테스트가 실패 할 경우 항상 적절한 피드백을보고 싶어합니다 따라서 문제가 무엇인지 쉽게 확인할 수 있습니다 그래서, TestCasephp에서, 여기서 우리는 public function setUp을 말할 것입니다 부모 집합 여기서 예외 처리없이 이것을 호출 할 것입니다

이제 여기서이를 삭제할 수 있습니다 다시 phpunit을 실행 해 봅시다 여기에 올바른 피드백이 있습니다이 가장 컨트롤러는 존재하지 않습니다 이제이 컨트롤러를 만들어 보겠습니다

PHP 장인 확인 : 컨트롤러 Admin \ ImpersonateController PHPUnit 실행 이제 인덱스 메소드가 존재하지 않습니다 이 방법을 만들어 보겠습니다 App Http 컨트롤러 Admin Impersonate 컨트롤러, 공개 함수 인덱스 다시 테스트를 실행하십시오 이제 우리는 200 개의 상태 코드를 얻습니다 그것은 인덱스 메소드를 치고 있습니다

하지만 여기서 우리는 로그인 페이지로 리다이렉트하는 것을 주장하고 싶다 자, 이제이 메소드를 작성해 보겠습니다 이 미들웨어와 패스 인증 그럼 다시 한번 시도해 봅시다 이번에는 예상대로 인증되지 않은 예외가 발생합니다

그래서, 초록색으로 만드십시오 여기 TestCasephp에서 이것을 주석 처리 할 수 ​​있습니다 실행 phpunit, 이제 그것은 녹색과 우리의 테스트가 전달됩니다 또는 우리가 할 수있는 일을 주석 처리하십시오

여기에 Exception Handling을 추가 할 수 있습니다 다시 한 번 쏴, 우리는 녹색이된다 로그인하지 않은 상태에서이 엔드 포인트를 방문하면 로그인 페이지로 이동해야합니다 그러나 사용자가 로그인 한 것으로 가정 해 봅시다 그래서 우리는 이것을 사용자라고합니다

이 사용자를 생성합시다 공장 App 사용자 클래스 만들기 그리고 여기 똑같은 일을 다시하고 상태 코드를 주장 할 것입니다 403입니다 그래서이 방법으로 우리는 당신이 손님이고이 일을하려고한다면 그것이 안된다는 것을 확인할 수 있습니다 일하다

그리고 일반 사용자라면 아무 것도 작동하지 않을 것입니다 우리는 테이블 사용자가 아니더라도 다시 실행할 것입니다 이것은 우리가 데이터베이스 새로 고침을 사용해야하기 때문입니다 테스트가 끝난 후 테스트 및 롤백 다시 한 번 실행하면 403 번이 아니라 200 번 상태가됩니다

이제 여기에는 커스텀 미들웨어 또는 다른 것이 필요합니다 따라서 간단하게 유지하고 사용자가 무언가를 관리 할 수 ​​있는지 여부를 알려 드리겠습니다 그렇게 이제 부팅 서비스 방법에 대한 인증 서비스 제공 업체로 이동합니다 이전에 게이트를 말할 것입니다

함수를 호출하면 사용자를 받아 들일 것이고 여기서는 필요한 논리를 수행하여 현재 인증 된 사용자에게 작업 수행 권한이있는 경우 그럼 여기서 뭘 할거야 사용자 테이블에 역할 열이 있다고 가정 해 보겠습니다 사용자 역할이 admin 인 경우 true를 반환합니다 이제 사용자 테이블에 역할 열을 추가해 보겠습니다 데이터베이스 이주에서 사용자 테이블 이주 파일을 작성하고, 여기에 테이블 문자열 역할을 추가하고 기본값은 회원

phpunit을 실행하고, 클래스 앱 제공 업체가 없습니다 여기에 타이핑 실수가 있습니다 이미 알아 차렸을 것입니다 다시 테스트를 실행하십시오 응답 상태 코드 403은 리디렉션 상태 코드가 아닙니다

우리는 여기서 실패하고 있습니다 이것은 우리가 여기에서 인증 미들웨어를 삭제했기 때문입니다 이것을 다시 추가합시다 PHPUnit과 우리는 녹색 얻을 지금까지 우리는 브라우저에서 이것을 테스트하지 않았습니다

브라우저에서 테스트하기 전에 PHP 숙련자 마이그레이션을 실행 해 봅시다 새로 고침 사용자 테이블에 새 역할 열을 추가했기 때문입니다 다음으로, 나는 터미널을 나눌 것이고 여기서 나는 달릴 것이다 php artisan serve 브라우저에서이 URL 열기 손님으로 admin / impersonate 경로를 방문하려고하면 즉시 리디렉션됩니다 로그인 페이지

이제 새 계정을 등록하십시오 Harish harish@examplecom 암호 및 등록 다시 admin / impersonate 경로를 방문하려고 시도하면 이번에는 403 오류가 발생합니다 관리자가 아닙니다

자, 터미널, php artisan tinker로 가자 사용자가 동일 함 App 사용자의 첫 번째 사용자 역할이 admin과 같습니다 다음으로 사용자 저장 이제 우리는 admin 사용자입니다 이번에는 admin / impersonate에 방문하면 이번에이 페이지에 액세스 할 수 있습니다 물론 우리는 컨트롤러에서 아무것도 인쇄하지 않았기 때문에 여기서는 아무 것도 볼 수 없었습니다

동작 그것을 확인하기 위해 echo "hello"가 출력됩니다 다음 단계는이 페이지에 대한보기를 만드는 것입니다 이제이보기를 만들어 보겠습니다 뷰 관리자 가장 인덱스를 반환합니다

이 인덱스 블레이드 파일을 작성해 보겠습니다 리소스보기 admin impersonate indexbladephp 다음으로 auth loginblade

php에서 일부 마크 업을 강요합니다 여기에서는 사용자를 가장하는 말을 할 것입니다 양식 작업은 admin slash impersonate이며, 이메일 필드가 필요합니다 다음으로이 비밀번호 필드가 필요 없습니다 그래서 이것을 지우십시오

그리고이 기억 영역도 필요하지 않습니다 다음은이 로그인 버튼으로 가장하는 것입니다 그리고 우리는 이것을 필요로하지 않습니다 브라우저에서 보도록하겠습니다 새로 고침

그리고 이것은 우리의 형식입니다 그런 다음이 양식을 제출하고 해당 사용자를 가장하려고합니다 그래서 이것을위한 테스트를 만들어 봅시다 그래서, ImpersonateUserTestphp에서이 테스트와 마찬가지로, 우리는 그것을 원하지 않습니다

관리자가 아닌 사용자가 가장 (impersonate) 요청을 제출할 수 있습니다 따라서 비 관리자 사용자는 사용자를 가장 할 수 없습니다 우리의 테스트가 거의 동일하기 때문에 여기에서 복사 해 봅시다 여기에 게시물 요청을 제출합니다 이것은 또한 게시물 요청입니다

이제 phpunit을 실행하면 405 오류가 발생합니다 우리가 아직 게시 경로를 만들지 않았기 때문입니다 자,이 게시물 경로를 만들어 보겠습니다 webphp에서 이것을 복제하십시오

이것은 게시 경로이며 행동은 가장입니다 이제 PHPUnit을 실행 해 봅시다 그리고 우리는이 가장을 만들지 않았는데도 녹색을 얻습니다 방법 우리는 이미 여기에서 보호를 구현했기 때문입니다

위생 검열을 위해 이것을 설명합시다 우리는 PHPUnit을 사용하여이 특정 테스트를 실행할 수 있습니다 – 필터는 동등하고 테스트합니다 여기서 실패했습니다 이제 주석 처리를 제거하고 다시 실행하십시오 통과합니다

다음으로 관리자가 사용자를 가장 할 수 있는지 확인하기 위해 다른 테스트를 추가해 보겠습니다 여기에는 사용자가 있으며 관리자도 있습니다 사용자 우리는이 역할을 관리자와 동일하게합니다 그런 다음 관리자로 로그인하여 관리자로 로그인합니다

그런 다음이 엔드 포인트를 제출하고 원하는 사용자의 이메일을 전달합니다 의장 그리고 나서 마침내 우리의 주장은이 주장이 될 것입니다 auth id는 사용자와 같습니다 신분증

괜찮아 그래서 우리는 관리자로 로그인하는 것입니다 그런 다음이 엔드 포인트에 게시물 요청을 제출하여 해당 사용자를 가장합니다 그리고 우리가 모든 것을 올바르게했다면 현재 인증 된 사용자는 관리자가되면 이제는 가장하고있는 사용자가됩니다 계속 해보자

물론 그것은 실패합니다 여기서 우리는 오류를 가장하는 메소드가 존재하지 않습니다 자,이 방법을 만들어 보겠습니다 이 테스트를 다시 실행하십시오, 이번에는 오류가 발생합니다 진행합니다

이제 우리의 주장은 실패합니다 2 경기 예상 1 이제이 기능이 어떻게 작동하는지 살펴 보겠습니다 여기에 요청 객체를 가져 오자 자, 여기, 우리는 물론 이메일을 검증하기를 원합니다

전자 메일이 필요하며 전자 메일 주소인지 확인해야합니다 또한 사용자 테이블에 있는지 확인하고 싶습니다 다음으로이 이메일에 연결된 사용자를 찾아 봅시다 사용자는 이메일이 요청 이메일 인 첫 번째 사용자를 잡는 앱 사용자와 같습니다 자, 여기서 내가 할 일은 인증 ID를 세션에 넣을 것입니다

그래서 우리는 session helper를 세션 impersonate_by auth id에 넣을 것입니다 그런 다음 여기에 해당 사용자로 로그인합니다 그래서, 정식 로그인과 패스 사용자 다음으로 홈페이지로 리디렉션합니다 리디렉션 홈으로 돌아갑니다

시험을 치자 이번엔 초록색입니다 이제 브라우저에서 살펴 보겠습니다 브라우저에서이를 테스트하려면 가장 할 새 계정이 필요합니다 이제이 관리 사용자를 로그 아웃하고 새 계정을 등록 해 봅시다

John John@examplecom 암호 및 등록 이 사용자는 회원이며 가장 할 수있는 권한이 없습니다 따라서 로그 아웃하고 관리자로 로그인하십시오 그것은 harish@examplecom입니다

admin slash sperson으로 이동합니다 여기에 회원 사용자 john@examplecom의 전자 메일 주소를 입력합니다 가장을 클릭하십시오 이제 우리는 요한으로 가장하고 있으며 요한을 대신해서 무엇이든지 할 수 있습니다

유일한 문제는 지금 로그 아웃하지 않으면 빠져 나갈 실제 방법이 없다는 것입니다 이제는 버튼을 만들고, 그 버튼을 클릭하면 우리는 가장을 멈추고 관리자에게 다시 로그인하십시오 먼저 테스트를 작성하겠습니다 여기에서 관리자 사용자가 가장 (impersonating)을 중지 할 수 있다고 말합니다 여기에서 모두 복사하십시오

따라서 관리자로 로그인 한 다음이 끝점에 게시물 요청을 제출해야합니다 해당 사용자를 가장하기 위해 여기에 있습니다 그리고 나서 현재 인증 사용자는 관리자가 아니어야합니다 이제는 해당 사용자 여야합니다 이제 가장 (impersonating)을 중지하기 위해이 끝점에 삭제 요청을 보냅니다

다음은이 주장이 auth id가 admin id와 같음을 나타냅니다 이 테스트를 실행 해 보겠습니다 경로를 만들지 않았기 때문에 실패합니다 그래서, webphp에서

이것을 복제하십시오 이것은 삭제 경로입니다 그리고 그 행동은 멈춘다 이제이 테스트를 실행하면 무단으로 예외가 발생합니다 이는이 삭제 요청을 제출할 때이 사용자로 로그인했기 때문입니다

그 사용자는 회원 사용자입니다 가장 (Impersonate) 컨트롤러에서이 경로를 보호했으며 유일한 관리자 만 사용할 수 있습니다 사용자 그래서, 여기서 우리는 중지 방법을 제외한 모든 것을 보호 할 것이라고 말할 것입니다 그리고 여기에 사용자가 가장하는 것을 중지 할 수 있습니다

테스트를 실행하면 다시 실패합니다 중지 방법이 존재하지 않습니다 자,이 방법을 만들어 보겠습니다 테스트를 다시 실행하십시오 이번에는 우리의 주장이 실패합니다

그래서, 우리가 어떻게 통과 시킬지 여기에 우리는 세션에 관리자 아이디를 저장했습니다 그래서, 우리는 그 id를 잡고 그 admin 사용자로 로그인 할 것입니다 그래서 여기에 Auth loginUsingId와 impersonate_by를 가져옵니다 세션에서

이제 더 이상 세션에서 impersonate_by가 필요하지 않습니다 그래서 이것을 지우십시오 세션 impersonate_by을 잊어 버려 그런 다음 관리자 가장을 페이지로 리디렉션합니다 그게 전부예요

테스트를 해보 죠 그리고 이번에는 초록색입니다 이제 브라우저에서이를보고 싶습니다 먼저 가장하지 마세요 버튼을 추가하십시오 탐색 표시 줄에

이를 위해 appbladephp 레이아웃으로 이동해 보겠습니다 바로 여기에 버튼을 추가 할 것입니다 그래서 여기에 우리가 말하길, 세션이 다음으로 가장하여 추가하는 경우 li class nav-item form 메소드 게시 조치는 admin slash impersonate입니다

csrf 토큰 및 메소드 삭제 버튼 클래스 btn btn-link 그리고 여기서 우리는 도용을 중지한다고 말합니다 여기 모두 있습니다 브라우저로 이동합니다 새롭게 하다

여기서 우리는 "도용 중지"버튼을 가지고 있습니다 이것을 클릭하십시오 관리자 인 Harish에게 다시 회신합니다 한 번 더 보자 우리는 john@example

com hit impersonate로 가장 할 것입니다 이제 우리는 John으로 로그인하고 대신 John을 대신하여 조치를 취할 수 있습니다 명의 도용을 중지하면 관리 사용자 Harish에게 다시 전환됩니다 이것은이 비디오의 전부입니다 튜토리얼이 마음에 들면 좋아하는 버튼을 클릭하고이 비디오를 공유하고 구독하는 것을 잊지 마세요

우리 다음 곧 출시 될 비디오에서 곧 만나요

Laravel Package Development – e02 – Getting started with PHPUnit, Composer and PSR4 Autoloading

좋아, 시작하자 그래서 우리는 프로젝트 이름이 언론에 있음을 알고있다

그래서 디렉토리를 만들고 그것을 Press라는 이름으로 만들어 봅시다 그 디렉토리로 바꾸자 이제 'git init'명령에 익숙 할 수도 있지만 그 사실을 알지 못할 수도 있습니다 composer에는 init 명령이 있으며이 명령을 실행하면 실제로 아주 기본적인 composerjson 설정을 만드는 과정을 안내합니다

파일 자, 내 공급 업체가 vicgonvt이고 패키지 이름이 언론입니다 설명에서, 설명을 쓰자 완전한! 작성자가 정확하므로 입력 할 수 있습니다 최소 안정성, 그 비워 두자

패키지 유형에서이 항목을 비워 둡니다 에 대한 라이센스를 얻으려면 여기에 적절한 라이센스를 입력하십시오 제 경우에는 MIT를 입을 것입니다 'composer init'을 사용하면 대화 형으로 의존성을 요구할 수 있습니다 지금, 우리는 이런 식으로하지 않을 것이지만 당신은 할 수 있습니다

그래서 마침내 우리가 한 일을 미리보고 확인하기 위해 enter를 누르십시오 자, PHPStorm에서 이 composerjson 파일을 살펴보고 이름, 설명, 라이센스 및 저자가 있으며 현재로서는 필요한 패키지가 없습니다 그걸 시작합시다 터미널로 돌아가서 우리는 'composer require – -dev orchestra / testbench' 지금, 테스트 벤치 실제로 가져올 것입니다 Laravel 프로젝트에서 모두 익숙한 동일한 환경에서 그것은 우리가 당신과 같은 방식으로 패키지를 개발할 수있게 해줄 것입니다

일반 Laravel 응용 프로그램입니다 이제 여기로 돌아가고 싶습니다 그리고 저는 보여주고 싶습니다 당신에게 패키지의 일부를 가져옵니다 무엇보다도 Laravel 프레임 워크, 익숙한 다른 패키지는이 심포니 중 일부입니다 PHPUnit뿐 아니라 컴포넌트도 제공합니다

이제 설치가 완료되었습니다 앞서 git 저장소를 초기화하십시오 'git init'그리고 우리는 비어있다 저장소 '자식 상태'우리는 여기에 몇 가지 디렉토리가 있습니다 이제, 당신은 그렇지 않을 수도 있습니다

벤더 디렉토리와 'idea'디렉토리와 이것은 Laravel이 실제로 아주 좋은 'gitignore'와 함께 배송되기 때문입니다 지금, 'git ignore'파일은 실제로 git에게 특정 디렉토리 나 파일을 무시하도록 지시합니다 버전 제어가 필요하지 않기 때문에이 작업을 수행합니다 소지품 벤더 디렉토리와 마찬가지로, 작곡가와 '

idea'디렉토리, 필자의 경우 PHPStorm 파일이므로 필요하지 않습니다 소스 컨트롤 내부 Laravel GitHub 페이지를 방문하여 그 자식은 파일을 무시합니다 이제이 파일을 보면 'idea'와 ' 납품업자 및 다른 2 개의 전화 번호부 여기에서 그래서 나가 실제로하고 싶은 무엇을 이 전체 파일을 프로젝트에 가져 오십시오

나는 모든 것을 선택할거야 그것을 복사하여 PHPStorm로 다시 전환하고 새 파일을 만듭니다 새로운 파일 이 파일의 이름을 'gitignore'로 지정하면 붙여 넣기 만하면됩니다

저장, '자식 상태'그리고 거기에 우리가 갈 파일은 우리가 준비가 완료됩니다 먼저 'git add'를 커밋하십시오 'git commit -m 최초 커밋'완벽한 우리는 커다란 진전을 이루고 있습니다 디렉토리 구조 이것은 약간되는 주제 중 하나입니다 확실하지 않기 때문에 패키지 개발을 시작할 때 복잡해집니다

파일을 어디에 두어야 할 지 확신하지만, 여기에는 쉬운 접근법이 있습니다 우리가 취할 접근법은 정확히 똑같은 디렉토리를 사용하는 것입니다 우리 Laravel 패키지에 익숙한 구조 다시 가자 한 번 더 Laravel GitHub 페이지를 방문하여 디렉토리 구조를 살펴보십시오

그래서 우리는 app 디렉토리, 부트 스트랩, 설정, 라우트, 스토리지, 테스트 등을 가지고 있습니다 기타 등등 이 똑같은 디렉토리 구조를 예외가 아니라 앱 디렉토리 대신 실제로 'src'라고 부릅니다 근원을 나타냅니다 패키지 커뮤니티에서는 모든 사람들이 주 디렉토리는 'src'이어야하므로 우리는 그 대회에 참석할 것입니다

와 다시 말하면 우리 터미널로 돌아가서 디렉토리 'src'디렉토리를 만들고 두 개의 디렉토리를 만들자 우리의 테스트 테스트 파일로 시작하면 내부에서 테스트 기능 테스트와 단위 테스트가 있습니다 다시 PHPStorm에서 테스트 디렉토리와 소스를 살펴볼 수 있습니다

그것은이 시점에서 물론 비어 있습니다 자, 우리가 활용하지 못하는 한가지 방금 자동 로딩이되었으므로 작곡가 인 json 파일로 돌아가 봅시다 몇 가지 항목을 추가하십시오 첫 번째 것은 '자동로드'입니다 우리는 psr-4에서이 작업을 수행 할 것입니다

우리가 알아야 할 첫 번째 것은 우리 네임 스페이스가 될 것입니다 내 사건 'vicgonvt \ press \'그리고 우리는 또한 그것을 말해야 만합니다 메인 항목 point는 우리의 경우에 'src'디렉토리 인 네임 스페이스를위한 것입니다 우리의 테스트를 자동로드하므로, 우리는 또 다른 항목 'autoload-dev'를 추가 할 것입니다 또한 psr-4와 약간 다른 네임 스페이스 'vicgonvt \ press \ tests \'그래서, 그 진입 점은 어디입니까? 글쎄, 그거야

우리의 테스트 디렉토리에 있어야하고 그게 다야! 이 시점에서 우리는 자동 로딩을하고 있습니다 PHPUnit을 실행할 준비가되었습니다 테스트 해 봅시다 'phpunit'과 오우 소년! 그것은 계획대로 가지 않았습니다! 권리? 우리는 'phpunit'과 모든 일을하는 데 익숙하지만 PHPUnit 만 사용합니다 실제로 많은 옵션이 있습니다

이제는 이러한 옵션을 볼 수없는 이유가 왜냐하면 Laravel은 실제로 PHPUnit에게 무엇을 지시하는 작은 파일을 가지고 있기 때문입니다 해야 할 것 이 파일을 살펴 보겠습니다 GitHub 저장소로 돌아 가면 다음 위치에 파일이 있습니다 여기에 'phpunitxml'이 있는데, 우리가 열면 실제로 모든 옵션이 보입니다

여기에는 유닛 테스트 스위트와 기능 테스트 스위트가 포함되어 있습니다 'gitignore'와 동일합니다 실제로이 전체 파일을 프로젝트에 가져와 봅시다 나는 갈거야

새 파일을 만들고 난 그것을 'phpunitxml'이라고 부를거야 PHPUnit은 실제로 이 파일을 찾을거야, 'phpunit'을 실행할 때, 그렇게 해보자 이 파일을 살펴볼 수는 있지만 기본적으로이 파일은 모두 옵션을 선택하면 테스트 스위트 섹션이 생성 된 다음 어떤 파일이 실제로 테스트 될지 그리고 마지막으로 우리는 환경 파일 우리는 지금 이것을 필요로하지 않기 때문에 실제로 지울 것입니다

그들과 당신이 변경해야 할 유일한 다른 것은 app 디렉토리 대신에있다 그것은 우리의 'src'디렉토리가 될 것입니다 저장을 클릭하고 iTerm으로 다시 전환하고 한 번 더 'phpunit'을 실행하면 테스트가 실행됩니다 마지막 하나 내가하고 싶은 일은, 우리가 할 수있는 아주 간단한 테스트를 작성하는 것입니다 정말로 뭔가 테스트

그래서 저는 새로운 PHP 클래스를 만들겠습니다 우리는 그것을 호출 할 것입니다 초기 테스트, 내 네임 스페이스 'vicgonvt Press Tests' 당신은 단순히 'php artisan make : tests'를 실행하는 데 익숙 할 수 있습니다 처음부터 테스트를 설정하는 데 익숙하지만 한 가지 알고있는 것은 모든 테스트가 테스트 케이스를 확장한다는 것이 Laravel의 경우에 있습니다 일반적으로 Laravel 프레임 워크의 테스트 케이스를 확장하지만 패키지를 개발할 때 우리는 실제로 테스트 케이스를 확장해야합니다

오케스트라 테스트 벤치에서 그리고 여기 있습니다, 전체 네임 스페이스는 'orchestra testbench testcase'입니다 여기까지 가져 왔고 우리의 첫 번째 간단한 테스트를 작성해 보겠습니다 자, 하나 내가 여기서주의하기를 바라는 것은 우리가 당신이 사용하는 모든 주장을하는 방법입니다 이미보고 있기 때문에, 우리는 진실을 주장하고 진실을 말하고 물론, 그렇게 될 것입니다 iTerm으로 돌아가서 'phpunit'을 한 번 더 실행 해 보겠습니다

시간이 지나면 우리는 녹색 테스트를 받게됩니다

Vim Tricks, UX Design, VueJS, PHPUnit und Regex – PHP Training

그것은 당신을 아주 다르게 가르치고 또한 당신은 더 잘 볼 수 있습니다 너라면 손에 든 키보드를 잡으면 그 상태를 유지할 수 있습니다

너 자신에게 무언가를 쓴다 그렇게 생각하십시오 때로는 적극적으로 참여 언제나처럼 수동적으로 샤워해야합니다 그래서 나는 그것을 추천 할 것이다 나는 큰 그림, 모든 것이 어떻게 구성되어 있는지에 대해 기뻐합니다

나는 다른 사람들과 이야기하는 것을 좋아한다 그 이유가 여기에있다 나는 모든 사람들에게 조언하고 싶었다 단지이 재미를 엄청나게 만듭니다 노출을 얻기 위해서

나는 Never Code Oneone 이벤트에 참석해 왔으며 항상 관심이 있습니다 이 테스트 주제는 당신의 일상 생활을 더 좋게 만들고 최적화 할 수 있습니다 이것이 GitLab 파이프 라인인지 여부 또는 우리가 현재 가지고있는 것은 PHPUnit과 Test Driven Development입니다 이러한 나는 매우 흥미로운 주제를 찾는다 나는 모두가 뭔가를 가질 수 있다고 생각한다

나는 PHP 부분에 가입했다 각 주제에 대해 10 가지 솔루션과 10 가지 프로그래밍 옵션이 있습니다 당신은 모든 사람의 말을 듣고 그 말을 듣게됩니다 어쨌든 당신이 주제에서 오지 않는다고하더라도 당신은 배웁니다 그리고 나

나는 최근에 누군가가 이벤트에 왔을 때 멋진 것을 발견했다 독일어도 전혀 말하지 않았으며 영어도 마찬가지입니다 그는 문제가 있었지만 그럼에도 불구하고 그는 그걸 가지고 일하려고 애를 썼고 멈췄다 또한 기록됩니다 그래서이 가족 환경

매우 친절한 모든 것 그래서 저는이 행사가 매우 훌륭하다고 생각합니다 장벽이 낮다 그리고 모두가 참여할 수 있습니다 모두 10 유로를 쓸 수 있습니다

기부 목적은 아주 좋은 것입니다 4 명의 연사, 4 명의 후원자는 우리를 정말로 화나게합니다 참가자의 레코드 번호 이번 세션의 네 편의 동영상은 모두 YouTube에 게시됩니다 했다

비디오 설명에서 찾을 수 있습니다 채널을 따라 가서 체재하십시오 녹색

Vim Tricks, UX Design, VueJS, PHPUnit und Regex – PHP Training

그것은 당신을 아주 다르게 가르치고 또한 당신은 더 잘 보게됩니다 너라면 손에 든 키보드를 잡으면 그 상태를 유지할 수 있습니다

너 자신에게 무언가를 쓴다 그렇게 생각하십시오 때로는 적극적으로 참여 언제나처럼 수동적으로 샤워해야합니다 그래서 나는 그것을 추천 할 것이다 나는 큰 그림, 모든 것이 어떻게 구성되어 있는지에 대해 기뻐합니다

나는 다른 사람들과 이야기하는 것을 좋아한다 그 이유가 여기에있다 나는 모든 사람들에게 조언하고 싶었다 단지이 재미를 엄청나게 만듭니다 노출을 얻기 위해서

나는 Never Code Oneone 이벤트에 참석해 왔으며 항상 관심이 있습니다 이 테스트 주제는 당신의 일상 생활을 더 좋게 만들고 최적화 할 수 있습니다 이것이 GitLab 파이프 라인인지 여부 또는 우리가 현재 가지고있는 것은 PHPUnit과 Test Driven Development입니다 이러한 나는 매우 흥미로운 주제를 찾는다 나는 모두가 뭔가를 가질 수 있다고 생각한다

나는 PHP 부분에 가입했다 각 주제에 대해 10 가지 솔루션과 10 가지 프로그래밍 옵션이 있습니다 당신은 모든 사람의 말을 듣고 그 말을 듣게됩니다 어쨌든 당신이 주제에서 오지 않는다고하더라도 당신은 배웁니다 그리고 나

나는 최근에 누군가가 이벤트에 왔을 때 멋진 것을 발견했다 독일어도 전혀 말하지 않았으며 영어도 마찬가지입니다 그는 문제가 있었지만 그럼에도 불구하고 그는 그걸 가지고 일하려고 애를 썼고 멈췄다 또한 기록됩니다 그래서이 가족 환경

매우 친절한 모든 것 그래서 저는이 행사가 매우 훌륭하다고 생각합니다 장벽이 낮다 그리고 모두가 참여할 수 있습니다 모두 10 유로를 쓸 수 있습니다

기부 목적은 아주 좋은 것입니다 4 명의 연사, 4 명의 후원자, 정말 화가났습니다 참가자의 레코드 번호 이번 세션의 네 편의 동영상은 모두 YouTube에 게시됩니다 했다

비디오 설명에서 찾을 수 있습니다 채널을 따라 가서 체재하십시오 녹색

VIM, UX Design, VueJS, PHPUnit und RegEx Workshop Training – HOF #NCAEvent

소프트웨어 엔터테인먼트의 안녕 친구, 1711에

Kempen의 Never Code Honone of Hall 이벤트입니다 나는 너에게 보여 줄게 이 비디오에서 우리를 기다리고있는 세션이 있습니다 일반적으로 관객을 자신의 세션으로 끌어들이는 데 가장 잘 관여 한 연사 통합 할 수 있습니다 즉, 무선 키보드를 사용합니다

Daniel Spiepmann은 Vim Advanced Tricks를 먼저 보여줍니다 그는 우리를 설명합니다 Vim의 원리, 우리가 가장 잘 사용하는 플러그인과 Vim으로 효과적으로 작업 할 수 있습니다 Vim은 위대한 편집자입니다 일상적으로 사용할 때 많은 재미를 볼 수 있습니다

어쩌면 원격 서버가 필요하고 때로는 구성이 필요합니다 경로를 조정하거나 조정하십시오 이것은 중요한 지식이며 우리는 이것을 깊게하고 무선 키보드 자체에 편리하게 들어가십시오 그 후에 Kerstin과 Christian은 좋은 UX 디자인을 만드는 방법을 보여 주었고 VueJS 애플리케이션에서 구현된다 VueJS의 실용적인 부분에서 우리는 무선 키보드로도 함께 알게됩니다

그것을 이해하고 실제로 적용하십시오 Rafal은 PHPUnit 프레임 워크로 테스트 주도 개발을 보여줍니다 Symfony 응용 프로그램 그는 전자 상거래를위한 가격 수입자가됩니다 우리와 함께 애플리케이션을 작성하고이 가져 오기 기능을 검토하십시오

이전에지도 테스트 그렇게하면 빠르고 안전하고 효과적 일 수 있습니다 무엇보다도, 우리는 하나의 시험도 어렵지 않다는 것을 알 수 있습니다 수입업자를 설정하고, 유익하고 유익한 시험이 있다면 로 마지막으로 토마스는 RegEx 세션을 다시했습니다

그게 아마도 지금까지 모든 사건에서 우리가 가진 최고의 세션 그는 두 번째 것을 가지고있다 비머가 가져온 RegEx 패턴은 다음과 같습니다 함께 특정 문제와 도전 있습니다 그것은 정말로 정말로 재미 있었다

html을 슬래시로 대체하십시오 슬래시가 경로 끝에 있는지 확인하십시오 양식 및 여러 항목 확인 유효성을 검사하고, 무엇보다도 문자열을 조작하십시오 이들은 매일 응용 프로그램에서 항상 사용하는 사례 (특히 URL의 경우) 예를 들어갑니다 루프와 if 문을 사용하는 길은 길다

여기서 몇 가지 일을 할 수 있습니다 물론 RegEx는 훨씬 더 효과적이며 무엇보다 빠른 것입니다 늘 그렇듯이, 우리는 사회 목적에 10 유로 100 %를 기부합니다 이번에는 장애인에 관한 구호 단체에 왔습니다 Viersen은 정상적인 일상 생활을 다시 돌보고 통합합니다

지원 우리는 또한 마차 차와 함께 마틴 앞에서 돌아올 것입니다 개인적으로 저녁에 맥주를 몇 개 더 주면 우리는 또한 좋은 결말이 있습니다 그래서 우리는 잘 돌봐야합니다 캐터링 아침과 점심과 함께 작은 음료가 당신 것입니다 또한 완전히 제공됩니다

이 이벤트가 가능하도록 지금까지 우리는 PageGroup, thiswork 및 Nexus의 세 스폰서를 보유하고 있습니다 다음 주에있을거야 아직 4 번째 스폰서가 있습니다 트위터 나 페이스 북과 당신은 또한 나에게 큰 것을 줄 것이다

소셜 미디어에서이 이벤트를 다시 공유하면이 작업을 즐기십시오 이미 그 일을 했더라도 모든 클릭 수가 계산됩니다 이 행사는 Kempen은 회의 다락방에서 열렸습니다 캄퍼 너에서 도보로 5 분 미만입니다

역 멀리 여기 아주 쉽다 뒤셀도르프에서 30 분 이내에 또한 자동차로 도착하는 사람들을위한 충분한 주차 공간이 있습니다 합니다 다시 한번 감사드립니다

관심 모든 링크는 아래 동영상에서 확인할 수 있습니다 설명 최신 채널을 통해이 채널을 팔로우하여 녹색으로 유지됩니다