PHP Seminar Berlin

저는 프로그래머입니다 – 오늘 자원 부족 여름 파티에서 베를린 출신 오늘 모든 장소에서 2 시간에 3 시간의 워크샵이있었습니다 TYPO3에 중점을 둔 여러 팀

개념 수락 테스트, 기능 테스트 및 단위 테스트 그 일은 정말 잘되고 재미있었습니다 우리는 무선 키보드와 잘 어울리 며 여기에 몇 가지 진술이 있습니다 네가 좋아하면 나 한테주고 채널을 따라 간다 예 안녕하세요 저는 Harald입니다

저는 리소스 부족에있어 시스템 관리자입니다 그리고 우리는 자원 부족으로 내부 직원들에게 큰 중요성을 부여합니다 더 교육 받아야한다 여기서 우리는 훈련, 워크샵 등을 조직합니다 우리는 외부 객원 강사를 초청합니다

우리는 그것을 매우 중요하게 생각합니다 사내에서 일어난다 직원들이 더 나은 동기를 갖기 때문이다 오히려 일하게 될 것입니다 일하는 것이 더 재미 있습니다

서로 볼 수 있습니다 교류가 잘되고 외부 강사의 도움이 매우 중요합니다 그것이 우리가 그 위에 구축 한 이유입니다 Roland의 교육 과정은 매우 쉽고 재미 있습니다 특히 우리가 배운 테스트의 글은 정말 멋지다

사실, 아주 간단합니다 확실히 확실히 더 자주 나는 단지 추천 할 수있다 우리는 잘 훈련 된 직원 여러 가지 이유로 회사에 도움이됩니다 실제로 고객 및 만족 한 고객에게 좋은, 행복한 고객은 더 나은 품질을 얻기 때문에 더 많은 서비스를 예약합니다 그들이 무엇에 개입 할 수 있는지 알아라

당신은 그 품질을 알지 못합니다 표면적으로 나타나지만 실제로는 테프와 이것이 우리가 개발자의 실적에 투자하는 이유입니다 그들이 초기 구현의 최신 기술을 사용할뿐만 아니라 품질 유지 방법 증가시키고 확보하십시오

What is Unit Testing | Code Testing #2

네, 테스트가 뭔지는 알지만 정확한 테스트는 무엇입니까? 이 에피소드에서 대답을 시작하겠습니다 나는 당신의 호스트 Sarthak입니다

이것은 웹 개발 관련 것들을위한 채널이며 잊지 마세요 구독하고 싶다면 벨 아이콘을 눌러 알림을 받으십시오 레벨 Vuejs와 관련된 멋진 동영상과 더 많은 것들이 반응합니다 우리가 여기서 배우려는 것을 보자 그래서 단위 테스트 무엇 단위 테스트하지만 그 전에 우리가 단위가 아닌지 보자 테스트는 단위 테스트가 소프트웨어 흐름이 무엇인지 알지 못합니다

사용자가 프로젝트를 어떻게 사용할 것인지 테스트하지 않는다는 것을 의미합니다 앱이나 사용자와는 다른 소프트웨어를 먼저 설치 한 다음 그는 두 번째 페이지로 이동하고 사용자가이 방법으로 갈 수 있는지 테스트해야합니다 단 한 건도 알지도 못했지만이 테스트는 단위 테스트가 아닙니다 컨트롤러를 테스트하는 것은 컨트롤러가 할 수 있기 때문에 단지 컨트롤을 사용하는 것이 아닙니다 컨트롤러가 가질 수있는 많은 기능 기능 및 유닛 테스트는 컨트롤러 전체를 테스트하는 것이 아닙니다

단위 테스트는 간단한 모듈을위한 것이 아닙니다 모듈이 있다고 가정하십시오 이미지를 최적화 한 다음 데이터베이스에 저장하고이 모든 것을 저장합니다 단위 테스트는 모듈을위한 것이 아니므로 많은 단계가있는 것 같습니다 테스트는 당신이 단위를 알았다는 것을 당신은 본 적이 있습니다

무언가는 단위가 하나라는 것을 의미하므로 하나의 함수에 대한 하나의 테스트 각각 간단한 것 테스트를위한 메소드는 각각의 메소드로 테스트를 작성합니다 메소드 테스트 한 가지만 당신이 오직 한 가지만 알기 때문에 그렇게 말했죠 컨트롤러는 많은 기능을 가질 수 있으므로 하나의 기능을 테스트 할 수 있습니다 기능은 한 가지만 할 수 있으므로 중요한 부분입니다 그리고 모든 유닛 테스트에서 아마도 하나의 주장이있을 것입니다

하나는 당신이 주장하는 주장 또는 일부에 대한 2 개 또는 3 개의 출력을 기대하고 있습니다 당신이 한 두 가지 또는 세 가지를 가지고 있음을 의미하는 기능 테스트 및 단위 테스트 단위 테스트가 하나만 체크 단위를 의미합니다 한 번에 기능 또는 하나의 기능에 대한 하나의 테스트를 수행 한 다음 단위 테스트를 수행해야합니다 그게 무슨 뜻인지 감추지 말라 나는 단지 한 가지 시험을 썼다는 것을 안다 데이터베이스에 사용자가 있는지 여부를 확인하려고 할 때 1 명의 사용자를 얻는 다른 시험 그러나이 2 개의 것은 이렇게 분리되어야한다 당신이 아니라면 첫 번째 테스트 두 번째 휴식을 실행하지 않는 것과 같지 않습니다 두 번째 테스트는 첫 번째 테스트를 완료 할 때마다 수행해야합니다

개별적으로 테스트하고 분명히 흐름에 따라서도 테스트가 방해하지 않습니다 내가 서로 말했듯이, 당신이 하나에 대한 사용자 정보를 얻는다면 함수 하나를 테스트 한 다음 기능을 전달할 필요가 없습니다 다른 테스트는 각 테스트가 자신의 정체성을 가지고 자신의 데이터를 자신의 구조 아무것도 그렇지 않으면 각 단위 테스트가 다른 테스트와 데이터를 공유하지 않는다는 것을 의미합니다 이것은 단위 테스트를 할 때주의해야 할 가장 중요한 것입니다 단위 테스트의 목표는 무엇입니까? 단위 테스트의 목표는 간단합니다

프로그램의 각 부분이 이 시점에서 가장 중요한 부분을 차지하는 고립 된 시스템은 고립 된 시스템이므로 단위 테스트는 각각에 대한 것입니다 각 시스템의 기능성과 테스트를 작성하여 단위에 관한 것입니다 테스트와 나는 당신이 이것을 좋아하지 않는다면 당신이이 에피소드를 좋아할 것이라고 확신합니다 에피소드는이 채널을 구독하고 내가 할 수있는 벨을 치면됩니다 웹과 관련된 다른 동영상을 업로드 할 때마다 알림을받습니다

개발 일들 그리고 그들은 페이스 북에서 연기로 따라 간다 Twitter Instagram 이 동영상을 개발자 친구와 공유하여 모든 사람이 무엇인지 알게하십시오 유닛 테스팅과 함께 다음 에피소드에서 우리는 우리가 처음부터 PHP 단위로 간단한 것을 테스트 할 수있는 방법을 배우는 PHP 단위 우리의 PHP 세계에있는 것, 그래서 우리는 다음 에피소드에서 그 때까지 잘 만날 것입니다

Getting Started with PHPUnit | Code Testing #3

phpunit은 PHP 코드를 테스트하는 간단한 도구이지만 어떻게 시작할 수 있습니까? PHP 유닛으로 스크래치하기 때문에 브라우저에서 PHP 유닛 검색을 입력하자 Google과 당신은 위대한 PHP 단위를위한 웹 사이트를 얻을 것이다

그러나 우리는 Sebastian Bergman의이 github 저장소에 관심이 있습니다 이제 열어 보겠습니다 이 github 저장소 및 당신은 매우이 웹 사이트에 좀 걸릴 수 있습니다 잘 설명 할 수는 없지만 시작하는 것이 좋다 어떻게 할 수 있는지 보여 주겠다 실제로 여기에서 시작하십시오

PHP 유닛 github 저장소가 있습니다 W 게이트 또는 PHP로 설치할 수있는 설치 부분이 있음을 알 수 있습니다 이런 종류의 물건을 좋아하지만 당신은 작곡가를 사용하여 다운로드하고 우리가 여기에 다운로드를 시작하기 위해 여기에 갈 필요가있다 작곡가를 통해 시작할 때 쉽고 그렇지 않은 경우 작곡가를 통해 작곡가에 대해 알기 만하면 패키지 도구 또는 종속성 관리자 일뿐입니다 PHP 관련 일을위한 패키지를 다운로드 할 수있게합니다

이것을 복사 할 필요가 없습니다 우리는 그것을 쓸 수 있지만 그 전에 우리가 할 수있는 것은 폴더를 생성 할 것입니다 그래서 mkdir과 ​​나는 이것을 PHP 단위 테스트라고 부를 것이므로 괜찮습니다 그리고 가자 PHP 단위 테스트 및 여기에 우리가 말할 것이다 작곡가 다음 PHP 단위 슬래시 PHP가 필요합니다 유닛과 예 (def dependency)가되어야합니다

localhost에있을 때 개발하면 테스트 만하면된다 enter 키를 누른다 무엇을 할 것인가 그것은 새로운 폴더에 PHP 단위 패키지를 다운로드합니다 vendor 폴더라는이 명령으로 만들어 지므로이 명령을 기다리 자 이제 HP 장치가 설치되어 있으므로이 PHP 단위로가 보겠습니다

우리가 만든 test 폴더와 예 우리는 세 개의 파일을 가지고 있습니다 그래서 이것을 열지 마십시오 VX 코드로 이제 3 개의 파일이 있다면이 복합체를 살펴 보겠습니다 JSON 파일은 간단합니다

단지 컴파일러가 의존하는 dev 종속성이 필요합니다 PHP 단위 71이며이 벤더 폴더에서는 예를 들어 많은 것들이 있지만 관심있는 폴더는 bin 폴더이고 여기에 실행 가능한 PHP 단위 그래서 우리가 이것을 실행하는 방법을 통합 터미널을 열어 보겠습니다 코드 대 여기 내가 입력 할 것입니다 입력하십시오 PHP 단위 그것은 특별한 단위입니다 PHP 유닛을 직접 실행하고 싶다면 설치가 필요합니다 PHP 단위는 전 세계적으로 사용되지만 레벨을 사용할 경우 필요하지 않습니다

수준은 이미 PHP 단위를 제공하므로 PHP 단위를 사용하는 것은 좋지 않습니다 전 세계적으로 PHP 유닛을 어떻게 운영 할 수 있습니까? 그래서 실제로 벤더 슬래시로 가야합니다 빈 슬래시 PHP 단위 그리고 만약 내가 지금 yes를 치면 괜찮아 렌더링해야합니다 우리는 많은 선택권을 얻고 있지만 뭔가를하고 싶다는 것을 알 수 있습니다 그것은 단지 PHP 유닛에 관련된 명령이나 관련 함수를 제공하지 않고 있습니다 우리가 가지고있는 많은 정보를 볼 수 있지만 우리가 원하는 정보 나는 뭔가를 만들었습니다

나는 그것을 확인하고 싶습니다 PHP 유닛 dot XM이라고하는 PHP 유닛을위한 새로운 파일을 생성해야합니다 XML 파일이므로 XML로 시작하고이 XML을 닫습니다 또한 이것은 좋은 그리고 가까운 슬래시 버전의 XML 버전 우리는 우리가 인코딩 할 필요가 없다는 것과 그렇지 않은 것을 하나의 포인트로 사용하게 될 것입니다 인코딩은 utf-8 간단한 것들이며, 우리는 PHP 단위를 말할 것입니다

XML 부분을 시작할 것입니다 여기서는 PHP 단위를 닫습니다 이 PHP 유닛이 시작될 곳에서 정의해야하는이 태그 CSS 부트 스트랩이 아닌 시작 지점을 의미하는 부트 스트랩을 말하고 싶습니다 시작 지점에서 스타일을 지정하여 실제로 부트 스트랩이 공급 업체 내부에 있음 당신이 얻을 것이다 벤더 폴더에 가면 이것은 자동로드 PHP 파일을 가지고 있습니다 이 자동로드 파일은 목적을 초기화하기위한 것입니다

이것이 이것이 이렇게 있어야한다는 것을 기억하십시오 XML이 좋으며 우리가 필요로하는이 PHP 유닛 태그 안에 괜찮습니다 정의 할 필요가있는 두 개의 태그가 있습니다 첫 번째 테스트 슈트는 무엇입니까? 이것이 F와 함께 있어야한다는 것을 기억하고 이것 안에 테스트 슈트가 있어야합니다 우리가 단 하나의 단수 테스트 슈트가 필요없는 복수형 테스트 슈트가 아닌 F 우리가이 테스트 슈트를 가지고 있는지 확인하십시오

디렉토리에 테스트를 넣어 디렉토리를 만들자 이 디렉토리와 디렉토리 이름은 우리가 생성 할 테스트입니다 아직 말하지 마라 유닛 테스트는 간단합니다 따라서 tests라는 새 폴더를 만들고 tests 폴더 안에 또 다른 폴더가 있습니다

여기에는 unit이라는 테스트 폴더가 없습니다 테스트 및이 부분은 그냥 PHP 단위 말할 괜찮을거야 tests 폴더에서 시작합니다이 테스트 폴더 내부에 어떤 것이 있으면 무엇이든 얻을 수 있습니다 테스트의 종류는 그렇게 보입니다 만약 당신이 무언가를 발견한다면, 그 테스트를 만드십시오

그럼 이제이 터미널 통합 터미널에 가서 여기를 지우면 어떻게 될까요? 한 번 더 벤더 빈을 실행하자 PHP 단위 결과를 보자 테스트가 실행되고 마지막 테스트와이 테스트의 차이점을 확인할 수 있습니다 그러나 색상을 정의하자 그리고 우리는 단지 okay가 나에게 어떤 색을 보여줄 것이라고 말할 것이다 이 PHP 유닛을 사용할 때 내가 지금 가면이 시간을 볼 수 있습니다

색상이 없는지 테스트하지 않는 것이 좋습니다 자세한 것은 장황색입니다 지금 우리가 다른 관련 정보를 볼 수 있다고 말한다면 이 테스트와이 테스트는 테스트와 관련하여 더 많은 정보를 제공합니다 이름이 실패 할 때 마지막으로 몇 가지 테스트가있을 때마다 가득 채워서 다른 테스트를 중단 했으므로 우리의 테스트가 완료되지 않았 음을 알리는 좋은 아이디어가 있습니다 그래서 우리의 PHP 단위 점 XML 파일은 완전하게 끝났습니다

내가 벤더 슬래시 빈 슬래시 PHP 단위에 쓸 때마다 알고 나는 이것을 실제로 좋아하지 않기 때문에 어떤 종류의 지름길이 필요하고 우리는 가지고 있지 않다 어떤 종류의 테스트이라도 테스트가 실행되지 않았으므로이 테스트를 만들 것입니다 단위 유닛 폴더에 저장되며 비아에 필요한 패키지 또는 확장 코드를 작성하지 않고이 테스트를 완벽하게 수행하는 코드 다음 에피소드에있는 것들은 그래서 구독하고 잊지 말고 종을 치십시오 동영상을 업로드 할 때마다 즉시 알림을받을 수 있습니다 페이스 북 트위터 Instagram LinkedIn에 영화와 함께 당신은 다음을 찾을 수 있습니다 동영상 링크가 설명과 전체 재생 목록에 표시되므로 만나겠습니다

그때까지의 다음 에피소드

Introduction (First look at BitBucket Pipelines, part 1)

안녕하세요 BitBucket Pipelines에 대한 새로운 비디오 시리즈에 오신 것을 환영합니다

새로운 서비스를 처음으로 살펴 봅니다 방금 최근에 비공개 베타 버전으로 발표되었습니다 방금 초대를 받았습니다 그렇다면 BitBucket Pipelines는 무엇입니까? 통합 된 지속적인 통합 서비스입니다 BitBucket에

완전히 무료이며 테스트 후 코드를 배포 할 수 있습니다 각 서비스에 커밋합니다 앱을 테스트하고 배포하려면 모든 소프트웨어를 사용할 수 있습니다 너는 좋아한다 파이프 라인은 Docker를 사용하여 사용자 정의 소프트웨어를 설치하고 테스트를 수행합니다

젠킨스 (Jenkins)와 같은 다른 지속적인 통합 도구의 대안으로 볼 수 있습니다 대나무, TeamCity 또는 트래비스 그래서이 시리즈에 대한 제 질문은 BitBucket 파이프 라인이 제 젠킨스 설치를 대체 할 수 있습니까? 우리가 알아 보자! 이 시리즈에서는 BitBucket 파이프 라인을 사용하여 PHPUnit 테스트를 실행하는 방법, 환경 변수를 사용하여 암호와 같은 중요한 정보를 저장하는 방법 웹 사이트를 FTP 서버 또는 Amazon S3에 배포 할 수 있습니다 등등 앞으로도 계속이 시리즈에 비디오를 추가 할 예정이므로 다시 확인하십시오 자주 그것은 소개를위한 것입니다 다음에 비디오 각 커밋 후에 파이프 라인을 사용하여 PHPUnit 테스트를 실행하는 방법을 보여 드리겠습니다

이 비디오가 마음에 들었거나 BitBucket 파이프 라인에 대해 더 자세히 알고 싶다면 다음을 확인하십시오 내 채널을 구독하거나 Twitter에서 나를 팔로우하십시오!

Running PHPUnit tests (First look at BitBucket Pipelines, part 2)

안녕하세요 여러분, 내 BitBucket Pipelines 시리즈의 일부인 비디오를보고 있습니다 에서 이 비디오에서는 BitBucket 파이프 라인을 사용하여 PHPUnit 테스트를 수행하는 방법을 설명합니다

그래서이 비디오의 목적을 위해 간단한 BitBucket 프로젝트를 만들었습니다 BitBucket이라고 부릅니다 파이프 라인 PHPUnit 테스트 및이 프로젝트는 동작을 모방 한 PHPUnit 클래스가 단 하나입니다 검 보 머신의 이 클래스에서 나는 하나의 속성을 가지고 있습니다 : 그것은 gumballs의 수입니다 그 기계에 있습니다

나는 기계에있는 엄청난 양을 얻기 위해 게터를 가지고있다 나는 기계에서 껌 볼의 양을 설정하는 세터를 가지고있다 그리고 나서 나는 기능을 가지고있다 기계가 gumball을 분배하는 것을 모의 실험하는 소위 회전 바퀴는 기계에있는 검볼의 양 이제이 프로젝트에서이 클래스를 위해 PHPUnit 테스트를 수행합니다

그래서 폴더 테스트에서 나는 GumballMachineTest를 가지고있다 만약 머신에 100 개의 검볼이 있다면 그리고 나는 바퀴를 돌린다 단지 99 명이 남아 있어야한다 그 말이 맞습니까? 이제는 같은 디렉토리에 phpunitxml 파일이 있습니다

이 파일을 통해 PHPUnit은 테스트가 실행되어야합니다 이제 우리가하고자하는 일 : BitBucket 파이프 라인을 활성화하여 모든 커밋 후에 이 프로젝트에서는 모든 PHPUnit 테스트를 실행합니다 그렇게하기 위해 왼쪽 열로 가자 아래로 스크롤하여 파이프 라인으로 이동하십시오 그래서 우리는 즉시 파이프 라인에 대해 우리에게 조금 더 알려주는 시작 화면으로 인사합니다

아르 그래서 설정 파이프 라인을 클릭하고 활성화 할 것입니다 그리고 바로 BitBucket은 특히 파이프 라인에 대한 템플릿을 보여줍니다 이 프로젝트가 PHP임을 알고 있습니다 그래서 그것은 나에게 PHP 파이프 라인을 제안한다

이제는 파이프 라인의 구성이 YAML 파일 그리고 BitBucket은 바로 그것을위한 템플릿을 제공합니다 템플릿은 실제로 매우 간단합니다 Docker 이미지를 정의하여 시작합니다 테스트 또는 배포가 실행되어야합니다

이 경우 BitBucket은 phpunit 사용을 제안합니다 Docker image, 나는 이것이 훌륭한 선택이라고 생각한다 당신이 정의 할 수있는 다른 것들은 이 스크립트가 실행되어야하는 분기와 스크립트가 통과해야하는 단계가 있습니다 에서 이 경우에는 작곡가 버전을 반향합니다 PHPUnit 버전을 반향시키고 설치합니다

작성자 종속성 BitBucket의 튜토리얼을 여기에 따라 복사 해 봅시다 클립 보드를 만들고 bitbucket-pipelinesyml 파일을 만듭니다 따라서이 파일에서 BItBucket이 제공 한 템플릿을 붙여 넣을 것입니다

하지만 이제 우리는 일부 단계가 변경됩니다 작곡가와 PHPUnit의 버전을 보여주는 대신 Composer 의존성을 설치하기 만하면 PHPUnit을 실행하게됩니다 그래서 나는 갈거야 이 모든 것을 대체하기 위해 phpunit (명령의 이름)을 입력 할 것입니다 그런 다음 구성 파일 (예 : -c)의 경로를 지정하고 구성 파일은 다음과 같습니다

tests / phpunitxml에 있습니다 이제 BitBucket Pipeline 구성 파일이 만들어졌습니다 그래서 이 파일을 커밋 할 예정이며 기본 커밋 메시지를 남겨두고 커밋을 치러 갈거야 그리고 이것은 이미 우리의 첫 번째 파이프 라인 빌드를 유발합니다

그래서 그냥 16 초 파이프 라인이 성공적으로 완료되었습니다 이제 파이프 라인을 열고 무엇을 볼 수 있습니까? 그것은 실제로 무대 뒤에서했다 그래서 여기 당신은 그것이 처음으로 내 이미지를 만들었고, 내 Docker 이미지를 가져 와서 PHPUnit을 실행했습니다 여기 나는 그것이 네, PHPUnit을 볼 수 있습니다 1 개의 테스트를했고 그것은 1 개의 주장을했다

좋아, 모든 것이 효과가있다 이제 오류가있을 때 작동하는지 확인해 보겠습니다 수업 그럼 소스로 돌아가서 우리의 검블 머신을 조작합시다 나는 편집 할거야

그것은 BitBucket 웹 사이트에서 조금 더 쉬워 졌기 때문입니다 그냥 분배하는 대신 바퀴벌레를 돌릴 때 한 움큼의 소리가 난다 나는 사용자가 돌았을 때 두 개의 소리 껌을 분배 할 것이다 바퀴 그래서 저는 커밋을 만들 것입니다

나는 그것을 "Bugges 버전이라고 부르겠다 gumball machine "과 새로운 커밋을 만들 것입니다 나는 파이프 라인으로 돌아갈 것입니다 즉시 새 빌드가 실행되어 동일한 빌드를 진행한다는 것을 알 수 있습니다 다시 한 번 단계

Docker 레지스트리로 갈 것이고, PHPUnit을 가져올 것입니다 이미지가 있고 거기에 당신이 있다면, 우리의 파이프 라인은 실패합니다 이제 클릭하여 왜 실패하는지 알 수 있습니다 여기 나는 네, GumballMachineTest, testIfWheelWorks는 "98이 예상 99와 일치한다고 주장하지 못했습니다"라고 말합니다

그래서 파이프 라인의 상태를 볼 수있는 곳이 두 곳 있습니다 너는 볼 수있어 그것은 꽤 명백한 파이프 라인에 있습니다 그러나 커밋 섹션에서도 볼 수 있습니다 커밋이 성공적으로 빌드 된 경우 실제로 커밋 사이에 볼 수 있습니다 실패한 경우

그것은이 비디오를위한 것입니다! 놀랍게도 실제로 PHPUnit을 얻는 것은 실제로 쉽습니다 BitBucket 파이프 라인에서 실행 및 실행 다음 비디오에서는 환경 변수를 사용하는 방법과 이유를 보여줄 것입니다 파이프 라인 이 비디오가 마음에 들었거나 BitBucket 파이프 라인에 대해 더 알고 싶다면 꼭 확인하십시오

내 채널을 구독하거나 Twitter에서 나를 팔로우하십시오!

Test Doubles with PHPUnit

– 테스트 복식은 실제의 클래스 또는 메소드 그들은 경우에 유용하다 어디서 격리하고 싶은지 테스트중인 부품 응용 프로그램의 나머지 부분에서

이 짧은 자습서에서, 어디서 어떻게 사용하는지 설명하겠습니다 다른 유형의 테스트 복식, 나는 더 나은 방법을 보여줄 것이다 테스트중인 부품을 격리하고, 나는 또한 예제를 줄 것이다 프로세스에 대한 가시성 확보 방법 그렇지 않으면 확인하기가 어렵습니다 테스트중인 애플리케이션 고객이 전화 통화를 가져옴 초과 사용을 위해 청구 할 수 있습니다

테스트는 통화 레코드 가져 오기에 중점을 둡니다 의 시작하자 단위 테스트중인 클래스 importFromCsv라는 메서드가 있습니다 파일을 읽고, 파싱 한 다음, 파싱 ​​된 레코드를 저장하고 반환합니다 파싱 ​​된 레코드를 저장하기 위해 데이터베이스 클래스를 사용합니다

그 문제는 우리는 그것을 인스턴스화해야한다 모든 자체 종속성과 함께 우리의 메서드에 대한 호출도 여기에있다 테스트를 늦출 것이다 우리가 데이터베이스를 정리하도록 강요하고, 자체 테스트 스위트와 중복, 전반적으로 유지해야 할 악몽이 될 수 있습니다 또한 parseCsvLine을 사용합니다

같은 학급 안에 있습니다 이것도 격리를 깨뜨릴 것입니다 가능한 의존성을 요구하며, 테스트와 중복, 유지 통증을 유발한다 구현을 변경하기로 결정할 때 여기에 방금 언급 한 parseCsvLine이 있습니다 문자열 줄을 받아 배열로 변환합니다

진행하기 전에 고객이 있는지 확인합니다 그런 다음 호출 클래스를 만듭니다 계산 된 분과 함께 시작 및 종료 시간을 기준으로 이 메서드는 isExistingCustomer라는 다른 메서드를 호출합니다 따라서 종속성 체인이 어떻게 보이는지 확인할 수 있습니다 매우 오래 걸리고 잠재적으로 필요할 수있다

매우 무거운 테스트가 설정되었습니다 반환 유형은 다음과 같습니다 Call 인스턴스의 다른 것 메서드에 의해 반환된다 PHP는 유형 오류로 실패합니다 따라서 테스트를 작성하지 않아도됩니다

헤이, 적은 수의 시험 다이어그램에서이 종속성 체인을 봅시다 importFromCsv는 Database의 인스턴스에 따라 다릅니다 그 데이터베이스는 차례대로 자체 데이터베이스를 가질 수 있습니다 생성자의 종속성

Database :: saveRecords 메서드 다른 메소드를 호출 할 수도 있습니다 importFromCsv는 parseCsvLine에 종속됩니다 그 메소드 자체는 isExistingCustomer에 의존한다 이는 다시 다른 것에 의존 할 수 있습니다 importFromCsv를 테스트 할 때, 그 방법이 기본 방법으로 간주됩니다

직접 연결된 모든 것이 공동 작업자입니다 뿐만 아니라 당신이 만들어야 할 것입니다 그것을 테스트하기위한 거대한 설정, 테스트를 변경해야합니다 언제든지 라인 변경에 따른 의존성이 생길 때마다 예를 들어 무슨 일이 일어나는가? isExistingCustomer가 나중에 수정 될 때 그것을 다른 메소드, getAllCustomers라고 부르기? 앞으로의 시험에서 당신의 시험을 관리 할 수있게 유지하려면, 종속성 체인을 줄이는 것이 필수적입니다 직접 연결된 공동 작업자를 조롱하여 parseCsvLine을 단위 테스트한다고합시다 이 기본 방법을 공동 작업자와 분리하려면, 우리는 isExistingCustomer의 기존 구현을 건너 뜁니다

우리는 시험에서 통조림으로 만든 응답을 되돌릴 수 있습니다 이렇게하면 종속성 체인이 끊어집니다 우리의 방법은 완벽하게 분리되어있다 외부 간섭으로부터 이것은 조롱의 본질입니다

parseCsvLine 메서드에 대한 단위 테스트를 작성합니다 우리는 5 분 간격으로 CSV의 시작일과 종료일 사이 정확한 분 수를 산출합니다 우리는 스텁을 설정했습니다 우리가 진짜를 혼합하고 있기 때문에 및 하나의 객체에서 스텁 메소드 우리는 PHP 유닛 모의 객체를 만듭니다 우리가 테스트를 작성하는 방법을 제외하십시오

isExistingCustomer 메소드를 사용합니다 willReturn true 미리 준비된 응답을 명시 적으로 설정 이 방법으로 우리가 원하는 이 테스트를 실행하는 동안 메서드는 CallImporter 클래스에 있어야하며, 구현은 중요하지 않습니다 이 시점에서 비어있을 수 있습니다 다음 단계는 테스트를 위해 데이터를 설정하는 것입니다 parseCsvLine에만 필요 CSV를 나타내는 문자열 그래서 우리가 여기에서 만들 것입니다

첫 번째 열은 고객 ID입니다 두 번째는 9시에 출발합니다 마지막 열은 9:05에 끝납니다 이제 우리는 기대를 설정했습니다 이 테스트는 그 통화 시간은 분 올바르게 계산됩니다

이것은 우리가 방법을 연습하는 단계이며, 우리가 메서드를 호출한다는 것을 의미합니다 우리가 설정 한 데이터로 변수 actualRecord 호출 유형의 오브젝트를 포함합니다 마지막으로 계산 된 분 우리의 기대와 일치합니다 다른 유형의 테스트 복식을 살펴 보겠습니다 모의 목적은 다른 용도로 사용됩니다

스텁이 우리를 확인하는 데 도움이되는 곳 검사가 끝난 상태, 조롱은 행동을 확인하는 데 도움이됩니다 이것은 다음 예제에서 분명해질 것입니다 물론 mock은 모두 같은 것을 제공합니다 어떤 시험 이중으로 이점, 같은 격리 및 연기 구현 이제 더미가 일반적으로 사용됩니다

매개 변수 목록을 빠르게 채울 수 있습니다 종종 전화를 걸지도 않고 단순히 거기에 있습니다 왜냐하면 인터페이스는 메소드가이를 요구하도록 강제했기 때문입니다 그들이 유용 할 때 이것은 유용하다 복잡한 매개 변수 목록을 가지고있다

의존성 체인을 깨뜨릴 수 있습니다 테스트를 위해 더 적은 수의 객체를 설정하십시오 다음은 우리가 모조품을 사용하는 방법입니다 기본 방법은 파일 읽기를 담당합니다 전화 통화 배열 반환 고객이 만든 각 줄의 구문 분석은 공동 작업자에게 위임됩니다

우리는 이미 그 라인들을 테스트했다 그 메소드에 의해 정확하게 파싱된다 그래서 다시 할 필요가 없습니다 그러나 우리는 이 메서드는 두 번 호출 된 예를 들어 실적에 유의해야합니다 더 많이 호출되면 일부 중첩 루프 제대로 설정되지 않았습니다

테스트가 실패합니다 이 확인은 모의를 사용하여 수행됩니다 두 번째 공동 작업자는 데이터베이스입니다 기본 방법에 필요합니다 이후 우리는 아무것도 검증하지 않을 것이기 때문에 이 테스트의 데이터베이스에서 우리는 더미를 사용할 것입니다

테스트 클래스로 돌아 가면, 우리는 또 다른 테스트를 만들거야 importFromCsv 메소드의 경우 두 줄의 CSV 파일을 사용하여이 파일을 호출하려고합니다 협업 메소드가 두 x 호출되는지 확인하십시오 먼저 우리는 모의 방송을 시작했습니다

앞의 예제와 동일합니다 우리는 실제 구현 만 유지합니다 시험 할 방법의 두 번째 부분은 다릅니다 방법을 스터빙하는 대신에, 우리는 그것을 조롱합니다, 즉 우리는 행동에 대한 기대를 설정합니다 우리는 협력 방법, parseCsvLine은 정확히 두 번 호출됩니다

이제 우리의 기본 방법은 데이터베이스 객체를 필요로합니다 이를 위해 더미를 사용합니다 PHPUnit에서 모의 ​​객체를 만들 때 추가 설정없이 그것은 기본적으로 더미를 만듭니다 그 메소드는 모두 스텁이됩니다 따라서 실제 데이터베이스 쓰기는 발생하지 않습니다

우리의 기본 방법은 또한 CSV 파일에 대한 경로가 필요합니다 여기에 두 줄의 간단한 CSV 파일이 있습니다 다음으로 우리는 그것을 호출하여 메서드를 실행합니다 파일 경로와 더미 데이터베이스 마지막으로 두 레코드가 반환되었는지 확인합니다

우리는 기록의 내용을 확인하지 않습니다 이전 테스트에서 이미 설정 되었기 때문입니다 게다가 우리는 실제 기록을 얻지 못할거야 실제 parseCsvLine이 호출되지 않기 때문입니다 여기서 또 다른 암시 적 확인이 있습니다

그것은 테스트가 끝날 때 발생합니다 PHPUnit은 앞서 설정 한 기대치를 검증합니다 그래서 우리가 한 통화로 기대를 바꾸면, PHPUnit이 알려줄 것입니다 "한 번 이상 부름을받을 것으로 예상되지 않았다" importFromCsv를 다시 테스트 할 것입니다 이번에는 SaveRecords가 올바른 횟수로 호출되었습니다

올바른 매개 변수가 전달되었는지 확인하십시오 이것은 스파이를 사용함으로써 성취 될 것입니다 그 메소드에 대한 호출을 도청합니다 해당 통화에 대한 모든 정보를 수집하십시오 이것은 이름 스파이가 나오는 곳입니다

이 테스트에서 우리는 saveRecords 올바른 매개 변수로 호출됩니다 여기에있는 설정은 단순히 내부 공동 작업자의 기본 방법 데이터베이스 더미가 여전히 필요합니다 실제 기록을 만드는 것을 피하기 위해, 그러나이 더미는 또한 우리가 간첩을 세우는 것을 도울 것입니다 saveRecords 메소드에 대한 호출이 여러 번 발생할 것으로 예상됩니다

기대에있어,이 모든 것은 사실 스파이를 반환합니다 이 메소드에 대한 모든 호출에 대한 데이터를 수집합니다 우리는 길을 세우고 그 길을 연습합니다 이것은 흥미로운 곳입니다 스파이가 호출 목록을 반환 할 수 있습니다

모든 통화 목록 saveRecords 메소드로 작성됩니다 그런 다음 메서드가 정확히 한 번 호출되었다고 주장 할 수 있습니다 우리가 모의 작업을 한 것과 비슷하다 하지만 조금 더 깊어집니다 첫 번째 매개 변수를 가져올 수도 있습니다

최초의 호출로부터, 배열보다 주장하다 saveRecords 메소드에 전달되었습니다 우리는 또한 첫 번째 항목 이 배열은 Call 유형의 객체입니다 따라서 기본 방법으로 저장하기로 결정한 경우 데이터베이스에 대한 다른 유형의 오브젝트, 테스트가 실패합니다 정말 멋진 가짜가 테스트를 제공합니다

대체 작업이있다 메소드의 구현 바로 가기를 사용하기위한 것입니다 특히 적합하다 프로토 타입을 신속하게 작성하기 위해, 테스트 속도를 높이고 다양한 엣지 케이스를 테스트합니다

예를 들어, 메모리 내 데이터베이스는 가짜입니다 실제 시스템에서는 사용하지 않을 것이며, 하지만 시험에 나설거야 가짜는 주로 통합 및 시스템 테스트에 사용됩니다 단위 테스트는 일반적으로 충분히 제어됩니다 다른 4 가지 유형으로 도망 갈 수 있습니다 이 예에서는 문맥에서 사용하겠다

단순화를 위해 단위 테스트를 실시합니다 importFromCsv 메소드를 다시 테스트하고 있습니다 올바르게 반응하는지 확인하고 싶습니다 무효 고객에게, 하지만 이번에는 스텁 대신 가짜를 사용했습니다 기본 방법을 다시 분리 해 봅시다

isExistingCustomer 메소드의 경우, 고정 값을 반환하는 대신, 이 메소드는 콜백 메소드를 반환 할 것이다 실제로 작동하는 구현과 함께, 데이터베이스에 안타까운 고객이 있는지 확인하십시오 앞의 예제에서, 그루터기 방법은 상관하지 않았다 귀하가 제공 한 고객 가짜 방법은 않습니다 999 이상의 고객 ID가 제공되면, 그렇지 않은 경우는 true를 돌려줍니다

고객 ID 1,000으로 CSV를 설정하고, 그 방법을 연습하십시오 이것은 예외를 던져야합니다 나는 그것이 가짜를 만드는 것을 안다 외부 API에 특히 유용합니다 각 유형이 무엇인지 아는 것 귀하의 테스트에 중요하지 않습니다, 너는 결국 본능을 개발할 것이다

어떤 유형을 어디에서 사용할 지 또한 너무 많은 양말이있는 경우, 잘못된 유형을 사용하고 있습니다 기본 방법 당 공동 작업자가 너무 많습니다 이 경우 디자인을 단순화하십시오 메소드의 길이를 줄임으로써 공동 작업자 수를 제한함으로써 각 방법이 가지고있는

자,이 비디오를위한 것입니다 좋아요를 누르고 내 채널을 구독하는 것을 잊지 마십시오 다가오는 워크샵 확인 자동화 된 테스트 아래의 설명에서 이 코드는 GitHub에서 사용할 수 있습니다 언제나처럼, Patreon에서 저를지지 해주십시오

더 멋진 동영상을 만드는 데 도움이됩니다 지켜보고 행복하게 코딩 해 주셔서 감사합니다!