이 패키지는 더 이상 사용되지 않습니다. 대신 Infection을 확인하세요.
Humbug는 PHP용 돌연변이 테스트 프레임워크입니다. 현재 개발 중이므로 실제로는 꽤 잘 작동하지만, 미니언 팀이 열심히 노력하여 해결하기에는 거친 부분이 있을 것입니다. 문 밖으로 떨어지면 경고를 받은 것입니다. ;)
$ git remote set-url upstream https://github.com/humbug/humbug.git
upstream
로컬에서 사용하는 리모컨의 이름으로 바꾸십시오. upstream
은 일반적으로 사용되지만 다른 것을 사용하고 있을 수도 있습니다. 다른 URL(예: [email protected]:mockery/mockery.git)을 사용할 수도 있습니다. 실제로 무엇을 사용하고 있는지 확인하려면 git remote -v
실행하세요.
목차
돌연변이 테스트는 간단히 말해서 단위 테스트에 돈을 투자할 수 있는 기회를 제공합니다. 여기에는 소스 코드에 작은 결함을 삽입한 다음 단위 테스트에서 발견되었는지 확인하는 작업이 포함됩니다. 그렇다면 단위 테스트가 돌연변이를 "죽인" 것입니다. 그렇지 않은 경우 돌연변이가 감지되지 않은 것입니다. 단위 테스트는 회귀를 방지하기 위한 것이므로 눈에 띄지 않는 실제 회귀 통과를 갖는 것은 나쁜 일입니다!
코드 적용 범위는 테스트가 실행 중인 코드를 알려주는 반면, 돌연변이 테스트는 단위 테스트가 실제로 얼마나 잘 수행되고 어디를 개선할 수 있는지 판단하는 데 도움을 주기 위한 것입니다.
나는 Mutation Testing이 왜 가치가 있는지에 대해 더 자세히 썼습니다: Lies, Damned Lies and Code Coverage: Towards Mutation Testing
Humbug는 누구나 끌어오기 요청과 문제를 환영하는 오픈 소스 프로젝트입니다. 풀 리퀘스트를 열기 전에 짧은 기여 가이드를 읽어보세요.
Composer를 사용하여 Humbug의 종속성을 복제하고 설치할 수 있습니다.
git clone https://github.com/humbug/humbug.git
cd humbug
/path/to/composer.phar install
humbug 명령은 이제 bin/humbug에 있습니다.
마스터 브랜치를 직접 추적하지 않으려면 다음과 같이 Humbug phar를 설치할 수 있습니다.
wget https://padraic.github.io/humbug/downloads/humbug.phar
wget https://padraic.github.io/humbug/downloads/humbug.phar.pubkey
# If you wish to make humbug.phar directly executable
chmod +x humbug.phar
Windows에서는 브라우저를 사용하거나 wget
이 Invoke-WebRequest
의 별칭인 다음 명령을 사용하여 Powershell v3에서 다운로드할 수 있습니다.
wget https://padraic.github.io/humbug/downloads/humbug.phar -OutFile humbug.phar
wget https://padraic.github.io/humbug/downloads/humbug.phar.pubkey -OutFile humbug.phar.pubkey
Powershell v2를 사용하는 데 문제가 있는 경우:
$client = new-object System.Net.WebClient
$client .DownloadFile( " https://padraic.github.io/humbug/downloads/humbug.phar " , " humbug.phar " )
$client .DownloadFile( " https://padraic.github.io/humbug/downloads/humbug.phar.pubkey " , " humbug.phar.pubkey " )
phar는 openssl 개인 키로 서명됩니다. 이를 사용하려면 항상 phar 파일 옆에 pubkey 파일을 저장해야 합니다. 예를 들어 humbug.phar
이름을 humbug
로 바꾸면 키 이름도 humbug.phar.pubkey
에서 humbug.pubkey
로 바꿉니다.
phar 릴리스는 현재 수동으로 수행되므로 git master와 동일한 빈도로 업데이트되지 않습니다. 현재 phar를 업데이트하려면 다음을 실행하세요.
./humbug.phar self-update
참고: phar를 사용하면 수정 사항이 해당 버전에 도달하는 데 시간이 더 오래 걸릴 수 있지만 안정적인 개발 버전을 확보할 수 있다는 확신이 더 커집니다. 공개 키는 한 번만 다운로드됩니다. 향후 phar 릴리스를 확인하기 위해 자체 업데이트를 통해 재사용됩니다.
릴리스가 안정 단계로 시작되면 알파, 베타, RC 및 최종 릴리스가 있을 것입니다. 개발 트랙 phar 파일은 안정적인 릴리스에 도달할 때까지 자동으로 자동 업데이트됩니다. 개발 수준 phar를 계속 추적하려면 안정성 플래그 중 하나를 사용하여 이를 표시해야 합니다.
./humbug.phar self-update --dev
예상치 못한 openssl
또는 SSL 오류로 인해 자동 업데이트 문제가 발생하는 경우 openssl
확장 프로그램을 활성화했는지 확인하세요. Windows에서는 명령줄에서 PHP용 php.ini
파일에 다음 줄을 추가하거나 주석 처리를 제거하여 이 작업을 수행할 수 있습니다(http 서버용 파일과 다른 경우).
extension=php_openssl.dll
인증서 누락으로 인해 기타 특정 SSL 오류가 발생할 수 있습니다. 시스템에서 해당 위치를 찾거나(예 C:/xampp/php/ext/cacert.pem
) http://curl.haxx.se/ca/cacert.pem에서 복사본을 다운로드하여 이를 수정할 수 있습니다. 그런 다음 다음 옵션이 이 파일을 올바르게 가리키는지 확인하십시오.
openssl.cafile=C:/path/to/cacert.pem
Humbug의 종속성이 최신 버전에 고정되어 있기 때문에 Humbug를 Composer.json에 추가하면 충돌이 발생할 수 있습니다. 이러한 경우에는 위의 두 가지 설치 방법이 선호됩니다. 그러나 다른 범용 도구처럼 전역적으로 설치할 수 있습니다.
composer global require ' humbug/humbug=~1.0@dev '
이전에 그렇게 하지 않았다면... 이것을 ~/.bash_profile
(또는 ~/.bashrc
)에 추가하십시오:
export PATH= ~ /.composer/vendor/bin: $PATH
Humbug는 현재 PHP 5.4 이상에서 작동합니다.
Humbug는 아직 개발 중이므로 반복해서 말하지만 거친 부분에 주의하세요.
프로젝트에서 humbug를 구성하려면 다음을 실행할 수 있습니다.
humbug configure
이 도구는 Humbug 구성 파일( humbug.json.dist
)을 생성하는 데 필요한 몇 가지 질문을 합니다.
프로젝트의 기본 디렉터리에 humbug.json.dist
파일을 만듭니다.
{
"timeout" : 10 ,
"source" : {
"directories" : [
"src"
]
} ,
"logs" : {
"text" : "humbuglog.txt" ,
"json" : "humbuglog.json"
}
}
humbug.json.dist
VCS에 커밋하고 humbug.json
파일을 사용하여 로컬로 재정의할 수 있습니다.
적절하게 편집하십시오. 로그를 하나 이상 정의하지 않으면 이스케이프된 돌연변이에 대한 자세한 정보를 사용할 수 없습니다. 텍스트 로그는 사람이 읽을 수 있습니다. 소스 파일이 기본 디렉터리에 있거나 소스 디렉터리의 파일을 제외해야 하는 경우 제외 패턴을 추가할 수 있습니다(다음은 작성기 공급업체 및 Tests 디렉터리가 제외되는 기본 디렉터리의 파일에 대한 패턴입니다).
{
"timeout" : 10 ,
"source" : {
"directories" : [
"."
] ,
"excludes" : [
"vendor" ,
"Tests"
]
} ,
"logs" : {
"text" : "humbuglog.txt"
}
}
프로젝트의 기본 디렉터리에서 다른 디렉터리의 테스트를 실행해야 하는 경우에도 신호를 보낼 수 있습니다. 프로젝트의 기본 디렉터리가 아닌 다른 디렉터리에서 Humbug를 실행할 필요는 없습니다.
{
"chdir" : "tests" ,
"timeout" : 10 ,
"source" : {
"directories" : [
"src"
] ,
}
}
테스트가 모두 통과 상태인지 확인하세요(불완전하고 건너뛴 테스트가 허용됨). 테스트 중 하나라도 실패하면 Humbug가 종료됩니다.
프로젝트의 기본 디렉터리에 있는 동안(PHAR 다운로드 사용) 마법 명령은 다음과 같습니다.
./humbug.phar
또는 방금 Humbug를 복제한 경우:
../humbug/bin/humbug
또는 Humbug를 프로젝트에 작곡가 종속성으로 추가한 경우:
./vendor/bin/humbug
xdebug 확장이 있는 PHP 대신 phpdbg를 통해 Humbug를 실행할 수도 있습니다.
phpdbg -qrr humbug.phar
모든 것이 잘 진행되었다면 다음과 비슷한 결과를 얻게 될 것입니다:
_ _ _
| || |_ _ _ __ | |__ _ _ __ _
| __ | || | ' | '_ || / _` |
|_||_|_,_|_|_|_|_.__/_,___, |
|___/
Humbug version 1.0-dev
Humbug running test suite to generate logs and code coverage data...
361 [==========================================================] 28 secs
Humbug has completed the initial test run successfully.
Tests: 361 Line Coverage: 64.86%
Humbug is analysing source files...
Mutation Testing is commencing on 78 files...
(.: killed, M: escaped, S: uncovered, E: fatal error, T: timed out)
.....M.M..EMMMMMSSSSMMMMMSMMMMMSSSE.ESSSSSSSSSSSSSSSSSM..M.. | 60 ( 7/78)
...MM.ES..SSSSSSSSSS...MMM.MEMME.SSSS.............SSMMSSSSM. | 120 (12/78)
M.M.M...TT.M...T.MM....S.....SSS..M..SMMSM...........M...... | 180 (17/78)
MM...M...ESSSEM..MMM.M.MM...SSS.SS.M.SMMMMMMM..SMMMMS....... | 240 (24/78)
.........SMMMSMMMM.MM..M.SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS | 300 (26/78)
SSSSSSSSM..E....S......SS......M.SS..S..M...SSSSSSSS....MMM. | 360 (37/78)
.M....MM..SM..S..SSSSSSSS.EM.S.E.M............M.....M.SM.M.M | 420 (45/78)
..M....MMS...MMSSS................M.....EME....SEMS...SSSSSS | 480 (52/78)
SSSSS.EMSSSSM..M.MMMM...SSE.....MMM.M..MM..MSSSSSSSSSSSSSSSS | 540 (60/78)
SSS....SSSSSSSSMM.SSS..........S..M..MSSMS.SSSSSSSSSSSSSSSSS | 600 (68/78)
......E...M..........SM.....M..MMMMM.MMMMMSSSSSSSM.SS
653 mutations were generated:
284 mutants were killed
218 mutants were not covered by tests
131 covered mutants were not detected
17 fatal errors were encountered
3 time outs were encountered
Metrics:
Mutation Score Indicator (MSI): 47%
Mutation Code Coverage: 67%
Covered Code MSI: 70%
Remember that some mutants will inevitably be harmless (i.e. false positives).
Humbug results are being logged as JSON to: log.json
Humbug results are being logged as TEXT to: log.txt
아마도 비밀스러운 진행 출력을 설명하려면 다음을 수행하십시오.
종료, 오류 및 시간 초과는 모두 감지된 돌연변이로 계산됩니다. 우리는 Humbug 자체에서 내부 오류가 발생했을 경우 로그에 오류를 보고합니다. 즉, 여기서 문제로 보고할 버그입니다!
예시 요약 결과는 다양한 지표 점수를 보고했습니다.
이러한 지표를 조사하면 눈에 띄는 문제는 MSI 47%가 보고된 코드 적용 범위 65%보다 18포인트 낮다는 것입니다. 이러한 단위 테스트는 코드 커버리지만으로 감지할 수 있는 것보다 훨씬 덜 효과적입니다.
이러한 결과를 해석하려면 몇 가지 맥락이 필요합니다. 로그에는 감지되지 않은 모든 변형이 원본 소스 코드와의 차이점으로 나열됩니다. 이를 조사하면 어떤 특정 돌연변이가 발견되지 않았는지에 대한 추가 통찰력을 얻을 수 있습니다.
Humbug에는 일반적으로 Symfony 콘솔 응용 프로그램과 관련된 옵션 외에 몇 가지 주목할 만한 명령줄 옵션이 있습니다.
단일 테스트에 대한 시간 초과 임계값을 수동으로 설정할 수 있습니다.
humbug --timeout=10
파일의 하위 집합만 변경하는 데 관심이 있는 경우 간단한 파일 이름, glob 또는 정규 표현식이 포함된 --file
옵션을 원하는 만큼 전달할 수 있습니다. 기본적으로 이들은 모두 Symfony Finder의 name()
메소드로 전달됩니다.
humbug --file=NewClass.php --file= * Driver.php
이는 진행하기 전에 모든 테스트가 올바르게 통과하는지 확인하기 위해 계속 전체적으로 실행되는 전체 테스트 모음에 대한 초기 Humbug 검사를 제한하지 않습니다.
몇 가지 특정 파일만 변경하려는 경우 전체 경로 파일 이름이 포함된 --path
옵션을 원하는 만큼 전달할 수 있습니다. 이 옵션은 --path
옵션을 사용하여 제공한 파일과 config 및/또는 --file
옵션을 사용하여 찾은 파일을 교차하는 필터 Closure
로 전달됩니다.
humbug --path=src/Data/NewClass.php --path=src/Driver/Driver.php
참고: 이는 진행하기 전에 모든 테스트가 올바르게 통과하는지 확인하기 위해 계속해서 전체적으로 실행되는 전체 테스트 모음에 대한 초기 Humbug 검사를 제한하지 않습니다.
증분 분석(IA)은 실행 사이에 결과가 로컬로 캐시되고 적절한 곳에 재사용되는 실험적이고 완료되지 않은 작업 모드입니다. 현재 이 모드는 변경되는 즉시 파일과 변경된 줄에 대한 관련 테스트가 마지막 실행 이후 수정되지 않은 테스트 실행을 제거하여 매우 순진하게 작동합니다(관련 파일의 SHA1을 비교하여 결정됨).
humbug --incremental
IA 모드는 상대적으로 안정적인 코드 기반에 대해 상당한 성능 향상을 제공하며 자유롭게 테스트하고 실제 생활에서 어떻게 작동하는지 확인할 수 있습니다. 앞으로는 상위 클래스, 가져온 특성 및 즉각적인 종속성 클래스를 포함하는 파일의 변경 사항을 고려해야 하며, 이 모든 것은 특정 개체의 동작에 영향을 미칩니다.
IA는 로컬 영구 캐시(예: /home/padraic/.humbug
를 활용합니다.
돌연변이 테스트는 전통적으로 느렸습니다. 생성된 각 돌연변이에 대해 테스트 스위트를 다시 실행하는 개념입니다. 작업 속도를 크게 높이기 위해 Humbug는 다음을 수행합니다.
이 모든 것이 Humbug 속도를 높이는 반면, Humbug 실행은 단위 테스트보다 속도가 느리다는 점에 유의하세요. 2초 테스트 스위트는 돌연변이 테스트에 30초가 필요할 수 있습니다. 아니면 5분. 이는 모두 코드 줄, 테스트 수, 코드 적용 범위 수준, 코드와 테스트 성능 간의 상호 작용에 따라 달라집니다.
Humbug는 기본적으로 특정 PHP 토큰이 변경될 수 있는 시기를 알려주고 해당 변경을 토큰 배열에 적용하는 기본 Mutator 제품군을 구현합니다.
참고: 클래스 메서드가 아닌 함수 내에 있는 소스 코드는 현재 변경되지 않습니다.
이진 산술:
원래의 | 돌연변이 | 원래의 | 돌연변이 |
---|---|---|---|
+ | - | /= | *= |
- | + | %= | *= |
* | / | **= | /= |
/ | * | & | | |
% | * | | | & |
** | / | ^ | & |
+= | -= | ~ | |
-= | += | >> | << |
*= | /= | << | >> |
부울 대체:
이는 일시적으로 논리적 변경자를 포함합니다.
원래의 | 돌연변이 |
---|---|
진실 | 거짓 |
거짓 | 진실 |
&& | || |
|| | && |
그리고 | 또는 |
또는 | 그리고 |
! |
조건부 경계:
원래의 | 돌연변이 |
---|---|
> | >= |
< | <= |
>= | > |
<= | < |
부정 조건:
원래의 | 돌연변이 | 원래의 | 돌연변이 |
---|---|---|---|
== | != | > | <= |
!= | == | < | >= |
<> | == | >= | < |
=== | !== | <= | > |
!== | === |
증분:
원래의 | 돌연변이 |
---|---|
++ | -- |
-- | ++ |
반환 값:
원래의 | 돌연변이 | 원래의 | 돌연변이 |
---|---|---|---|
사실을 반환; | 거짓을 반환; | 1.0>을 반환합니다. | 반환 -( + 1); |
거짓을 반환; | 사실을 반환; | $this를 반환합니다. | null을 반환; |
0을 반환합니다. | 1을 반환합니다. | 반환 함수(); | 기능(); null을 반환; |
반품 ; | 0을 반환합니다. | 새 클래스를 반환합니다. | 새로운 클래스; null을 반환; |
0.0을 반환합니다. | 1.0을 반환합니다. | 반환( Anything ); | ( Anything ); null을 반환; |
1.0을 반환합니다. | 0.0을 반환합니다. |
리터럴 숫자:
원래의 | 돌연변이 |
---|---|
0 | 1 |
1 | 0 |
정수 > 1 | 정수 + 1 |
부동 >= 1 / <= 2 | 플로트 + 1 |
플로트 > 2 | 1 |
If 문:
모든 if 문은 대부분 이전 변경자에 의해 다루어졌지만 비교나 연산 없이 네이티브 함수나 클래스 메서드를 사용하는 것과 같은 특별한 경우도 있습니다(예: is_int()
또는 in_array()
. 파일에 정의된 함수는 런타임까지 존재하지 않기 때문에 여기에는 포함되지 않습니다(다른 작업이 필요합니다!).
원래의 | 돌연변이 |
---|---|
if(is_int(1)) | if(!is_int(1)) |
시간이 지남에 따라 더 많은 Mutator가 추가될 예정입니다.
bin/humbug stats ../my-project/humbuglog.json ../my-project/list-of-classes.txt --skip-killed=yes [-vvv]
humbuglog.json 또는 사용자 정의 이름의 JSON 로그에서 통계를 구문 분석합니다.
CLI 참조:
humbug stats [humbuglog.json location] [class list location] [--skip-killed = yes] [-vvv]
humbuglog.json location, defaults to ./humbuglog.json
class list location, a path to a text file containing full class names, one per line.
only this files-related stats would be shown
--skip-killed=yes is used to completely skip output of "killed" section
various verbosity levels define amount of info to be displayed:
by default, there's one line per class with amount of mutants killed/escaped/errored/timed out (depending on output section)
-v adds one line per each mutant with line number and method name
-vv adds extra line for each mutant, displaying diff view of line mutant is detected in
-vvv shows full diff with several lines before and after
이는 humbug의 디렉토리에서 실행하여 humbug 자체에서 테스트할 수 있습니다.
bin/humbug bin/humbug 통계 [-vvv]
다음은 알려진 문제의 간단한 목록입니다.
한때 비어 있던 저장소에서 잠재력을 본 Craig Davis 제공:P.
.:::::::::::...
.::::::::::::::::::::.
.::::::::::::::::::::::::.
::::::::::::::::::::::::::::.
::::::::::::::::::::::::::::::: .,uuu ...
:::::::::::::::::::::::::::::::: dHHHHHLdHHHHb
....:::::::'` ::::::::::::::::::' uHHHHHHHHHHHHHF
.uHHHHHHHHH' ::::::::::::::`. uHHHHHHHHHHHHHP"
HHHHHHHHHHH `:::::::::::',dHHuHHHHHHHHP".g@@g
J"HHHHHHHHHP 4H ::::::::' u$$$.
".HHHHHHHHP" .,uHP :::::' uHHHHHHHHHHP"",e$$$$$c
HHHHHHHF' dHHHHf `````.HHHHHHHHHHP",d$$$$$$$P%C
.dHHHP"" JHHHHbuuuu,JHHHHHHHHP",d$$$$$$$$$e=,z$$$$$$$$ee..
"" .HHHHHHHHHHHHHHHHHP",gdP" ..3$$$Jd$$$$$$$$$$$$$$e.
dHHHHHHHHHHHHHHP".edP " .zd$$$$$$$$$$$"3$$$$$$$$c
`???""??HHHHP",e$$F" .d$,?$$$$$$$$$$$$$F d$$$$$$$$F"
?be.eze$$$$$".d$$$$ $$$E$$$$P".,ede`?$$$$$$$$
4."?$$$$$$$ z$$$$$$ $$$$r.,.e ?$$$$ $$$$$$$$$
'$c "$$$$ .d$$$$$$$ 3$$$.$$$$ 4$$$ d$$$$P"`,,
"""- "$$".`$$" " $$f,d$$P".$$P zeee.zd$$$$$.
ze. .C$C"=^" ..$$$$$$P".$$$'e$$$$$P?$$$$$$
.e$$$$$$$"="$f",c,3eee$$$$$$$$P $$$P'd$$$$"..::.."?$%
4d$$$P d$$$dF.d$$$$$$$$$$$$$$$$f $$$ d$$$" :::::::::.
$$$$$$ d$$$$$ $$$$$$$$$$$$$$$$$$ J$$",$$$'.::::::::::::
"$$$$$$ ?$$$$ d$$$$$$$$$$$$$$$P".dP'e$$$$':::::::::::::::
4$$$$$$c $$$$b`$$$$$$$$$$$P"",e$$",$$$$$' ::::::::::::::::
' ?"?$$$b."$$$$.?$$$$$$P".e$$$$F,d$$$$$F ::::::::::::::::::
"?$$bc."$b.$$$$F z$$P?$$",$$$$$$$ ::::::::::::::::::::
`"$$c"?$$$".$$$)e$$F,$$$$$$$' ::::::::::::::::::::
':. "$b...d$$P4$$$",$$$$$$$" :::::::::::::::::::::
':::: "$$$$$".,"".d$$$$$$$F ::::::::::::::::::::::
:::: be."".d$$$4$$$$$$$$F :::::::::::::::::::::::
:::: "??$$$$$$$$$$?$P" :::::::::::::::::::::::::
:::::: ?$$$$$$$$f .::::::::::::::::::::::::::::
:::::::`"????"".::::::::::::::::::::::::::::::