모듈:스크리쿤을 유닛으로 이동
Module이 모듈은 다른 Lua 모듈에 대한 장치 테스트를 제공합니다.모듈을 테스트하려면 별도의 테스트 모듈을 생성해야 합니다. 일반적으로 다음 위치에 있습니다.Module:Module name/testcasesScribuntoUnit 모듈을 사용하여 모듈을 테스트합니다. 이 모듈은 테스트 모듈에 정의된 작업이 예상 결과를 생성하는지 확인합니다.
테스트 모듈 구조
테스트 모듈(테스트 스위트)을 만들려면 다음 코드로 시작합니다.
현지의 나의 모듈 = 요구하다('모듈:내 모듈') 테스트할 모듈 현지의 스크리쿤을 유닛으로 이동 = 요구하다('모듈:스크리쿤을 유닛으로') 현지의 스위트룸 = 스크리쿤을 유닛으로 이동:신규() 이 작업을 수행한 후에는 개별 테스트 기능을 에 추가할 수 있습니다.suite물건.다음으로 시작하는 모든 함수test는 테스트로 처리됩니다. (다른 함수는 ScribuntoUnit에 의해 무시되지만 테스트 자체에 사용될 수 있습니다.)
기능. 스위트룸:testSomeCall() 자신:평등을 주장합니다.('기대값', 나의 모듈.썸콜(123)) 자신:평등을 주장합니다.('기타 기대값', 나의 모듈.썸콜(456)) 끝. 기능. 스위트룸:일부 다른 호출 테스트() 자신:평등을 주장합니다.('기대값', 나의 모듈.약간의 다른 전화(123)) 자신:평등을 주장합니다.('기타 기대값', 나의 모듈.약간의 다른 전화(456)) 끝. 작성한 테스트는 주장을 해야 하며 ScribuntoUnit은 그러한 주장이 사실인지 확인합니다.예를들면,assertEquals지정된 두 인수가 모두 동일한지 확인합니다.ScribuntoUnit이 참인 어설션을 찾지 못하면 테스트가 실패하고 오류 메시지가 생성됩니다.확인에 실패한 어설션을 나타내는 오류 메시지가 표시됩니다(지금은 어설션에 대한 다른 검사가 수행되지 않음).
테스트 모듈을 완료하려면 다음을 반환해야 합니다.suite물건.
돌아가다 스위트룸 테스트 실행
테스트는 Lua 디버그 콘솔을 통해 실행할 수 있고 #invoke를 사용하여 Wiki 페이지에서 실행할 수 있습니다.디버그 콘솔을 통해 테스트를 실행하는 경우 코드를 사용합니다.require('Module:MyModule/testcases').run()Wiki 페이지에서 실행하는 경우 코드를 사용합니다.{{#invoke:MyModule/testcases run}}결과가 포함된 테이블이 생성됩니다.코드를 사용하여 보다 컴팩트한 테이블을 표시할 수도 있습니다.{{#invoke:MyModule/testcases run displayMode=short}}.
테스트
오류 메시지
모든 테스트 방법의 마지막 매개 변수는 유효성 검사에 실패할 경우 표시되는 메시지입니다.
자신:평등을 주장합니다.("기대값", 나의 모듈.썸콜(123), "내 모듈에 대한 호출.someCall(123)이 예상 값을 반환하지 않았습니다.") 실패하다
자신:실패하다(메세지) 무조건 테스트에 실패합니다.
자신:실패하다("X 때문에 테스트가 실패했습니다.") assert True, assert False
자신:참임 주장(표현, 메세지) 자신:assertificate(표현, 메세지) 이것들은 주어진 표현식이 평가되는지 여부를 테스트합니다.true또는false루아에서 참고.false그리고.nil로 평가함.false그리고 다른 모든 것들은 평가합니다.true.
자신:참임 주장(2 + 2 == 4) 자신:참임 주장('fo') 자신:assertificate(2 + 2 == 5) 자신:assertificate(영의) assertStringContains
자신:assertStringContains(양식, s, 평지, 메세지) 이것은 테스트를 합니다.pattern문자열에서 발견됨s.한다면plain그렇다면, 사실입니다.pattern문자 그대로의 텍스트로 해석됩니다. 그렇지 않으면,patternustring 패턴으로 해석됩니다.
문자열을 찾을 수 없는 경우 오류 메시지에 다음 값이 표시됩니다.pattern그리고.s만일s잘린 버전이 표시되는 것보다 길이가 70자가 넘습니다.이 방법은 복잡한 위키 텍스트에서 특정 동작을 테스트하는 데 유용합니다.
자신:assertStringContains("foo", "푸바") 패스 자신:assertStringContains("foo", "포바") 실패함 자신:assertStringContains(".oo", "푸바") 패스: "foo"와 일치합니다. 자신:assertStringContains(".oo", "푸바", 진실의) fails: .는 문자로 해석됩니다. assertNotStringContains
자신:assertNotStringContains(양식, s, 평지, 메세지) 이것은 의 반대입니다.assertStringContains다음과 같은 경우 테스트가 실패합니다.pattern문자열에서 발견됨s.한다면plain그렇다면, 사실입니다.pattern문자 그대로의 텍스트로 해석됩니다. 그렇지 않으면,patternustring 패턴으로 해석됩니다.
자신:assertNotStringContains("foo", "푸바") 실패함 자신:assertNotStringContains("foo", "포바") 패스 자신:assertNotStringContains(".oo", "푸바") 실패: "foo"와 일치합니다. 자신:assertNotStringContains(".oo", "푸바", 진실의) pass: .는 문자로 해석됩니다. 평등을 주장합니다.
자신:평등을 주장합니다.(기대됩니다, 실제., 메세지) 첫 번째 모수가 두 번째 모수와 동일한지 여부를 검정합니다.두 모수가 모두 숫자인 경우 값은 대신 다음을 사용하여 비교됩니다.assertWithinDelta델타 1e-8(0.00000001)은 숫자가 제한된 정밀도의 부동 소수점으로 표현되기 때문입니다.
자신:평등을 주장합니다.(4, 계산기..더하다(2, 2)) 동일하지 않음을 주장
자신:동일하지 않음을 주장(기대됩니다, 실제., 메세지) 첫 번째 모수가 두 번째 모수와 동일하지 않은지 여부를 검정합니다.두 모수가 모두 숫자인 경우 값은 대신 다음을 사용하여 비교됩니다.assertNotWithinDelta델타 1e-8(0.00000001)은 숫자가 제한된 정밀도의 부동 소수점으로 표현되기 때문입니다.
자신:동일하지 않음을 주장(5, 계산기..더하다(2, 2)) 델타 내에서 주장
자신:델타 내에서 주장(기대됩니다, 실제., 삼각주, 메세지) 두 숫자의 경우 첫 번째 숫자가 두 번째 숫자로부터 주어진 거리(델타) 내에 있는지 여부를 검정합니다.이는 Lua의 표준 설치에서 숫자를 나타내는 데 사용되는 부동 소수점 번호를 비교하는 데 유용합니다. (정확히는 이중 정밀 부동 소수점 번호를 사용합니다.)예를 들어 영어 위키백과에 설치된 Scribunto 버전에서는 다음과 같은 표현이 있습니다.0.3 – 0.2 == 0.1로 평가함.false이것은 실제로, 그 표현이0.3 – 0.2동등한0.09999999999999997780…그리고 숫자0.1동등한0.10000000000000000555…두 가지 사이의 약간의 오차는 Lua가 두 가지를 동등하게 생각하지 않는다는 것을 의미합니다.따라서 두 부동 소수점 수 사이의 동일성을 검정하려면 동일한 값이 아니라 서로의 작은 거리(델타) 내에 있는 값을 받아들여야 합니다.이 문제는 정수에 영향을 주지 않으며, 2^53의 값까지 이중 정밀 부동 소수점 수를 사용하여 정확하게 표현할 수 있습니다.
자신:델타 내에서 주장(0.1, 계산기..빼다(0.3, 0.2), 1e-10) 델타 내에 없음 주장
자신:델타 내에 없음 주장(기대됩니다, 실제., 삼각주, 메세지) 두 숫자의 경우 첫 번째 숫자가 두 번째 숫자로부터 주어진 거리(델타) 내에 있지 않은지 여부를 검정합니다.이 테스트는 어설션의 역입니다.델타 안에서.
자신:델타 내에 없음 주장(0.1, 계산기..빼다(0.3, 0.1), 1e-10) 딥이퀄(DeepEquals
자신:딥이퀄(DeepEquals(기대됩니다, 실제., 메세지) 첫 번째 모수가 두 번째 모수와 동일한지 여부를 검정합니다.매개 변수가 테이블인 경우 재귀적으로 비교되며 __eq 메타메소드가 존중됩니다.
자신:딥이퀄(DeepEquals(표 1., 표 2) 템플릿 동일성 확보
자신:템플릿 동일성 확보(기대됩니다, 템플릿, 논병아리, 메세지) 첫 번째 매개 변수가 템플릿 호출과 동일한지 여부를 테스트합니다.두 번째 매개 변수는 템플릿 이름이고 세 번째 매개 변수는 템플릿 인수의 테이블입니다.
자신:템플릿 동일성 확보(4, '추가', {2, 2}) {{add22}}이(가) 4이면 true입니다. XML 표기법으로 작성된 일부 태그는 올바르게 테스트할 수 없습니다. 다음에 대한 참고 사항을 참조하십시오.assertResultEquals아래의 기능.
결과를 동일하게 주장
자신:결과를 동일하게 주장(기대됩니다, 본문, 메세지) 첫 번째 매개 변수가 위키 텍스트의 확장과 동일한지 여부를 테스트합니다.두 번째 매개 변수는 임의의 위키 텍스트일 수 있습니다.
자신:결과를 동일하게 주장(4, '{Num}:계산기 추가 22}}') XML 표기법으로 작성된 일부 특수 태그는 다음과 같습니다.<pre>,<nowiki>,<gallery>그리고.<ref>정확하게 비교할 수 없습니다.이러한 태그는 Lua에 의해 처리되기 전에 스트립 마커로 변환됩니다.스트립 마커는 동일한 입력에서 생성된 경우에도 고유하므로 이러한 태그의 동일성을 테스트하는 모든 테스트가 실패합니다.이는 다음에도 적용됩니다.assertTemplateEquals그리고.assertSameResult기능들.
동일한 결과 주장
자신:동일한 결과 주장(텍스트 1, 텍스트 2, 메세지) 이것은 지정된 위키텍스트 문자열의 확장이 다른 위키텍스트 문자열의 확장과 동일한지 여부를 테스트합니다.이는 모듈이 교체하려는 템플릿과 동일한 방식으로 작동하는지 확인하는 데 유용할 수 있습니다.
자신:동일한 결과 주장('{{add22}}', '{Num}:계산기 추가 22}}') XML 표기법으로 작성된 일부 태그는 올바르게 테스트할 수 없습니다. 다음에 대한 참고 사항을 참조하십시오.assertResultEquals위의 기능
스로우즈를 주장합니다.
자신:스로우즈를 주장합니다.(에프앤, 예상 메시지, 메세지) 이것은 주어진 함수가 예외를 던지는지 여부를 테스트합니다. 만약expectedMessage아닙니다nil지정된 오류 메시지와 함께 예외가 발생했는지 확인합니다.
참고 항목
------------------------------------------------------------------------------- 스크리분토에 대한 유닛 테스트. ------------------------------------------------------------------------------- 요구하다('''비공식''') 현지의 디버그 도우미 = {} 현지의 스크리쿤을 유닛으로 이동 = {} cfg 테이블에는 모든 현지화 가능한 문자열과 구성이 포함되어 있습니다. 이 모듈을 다른 Wiki로 이식하는 것이 더 쉽습니다. 현지의 cfg = mw.로드 데이터('모듈:Unit/config'로 스크롤합니다.) ------------------------------------------------------------------------------- 템플릿 또는 파서 함수 인수 테이블을 표시하는 데 이상적인 키와 값을 연결합니다. @paramkey키키키와 값 사이의 구분자 접착제("="로 표시) @다른 키-값 쌍 사이의 매개 변수 구분 기호 접착제(", "" 참조) @상당한 사기.키 포함({a = 1, b = 2, c = 3, ' => ', ', ') => "a => 1, b => 2, c => 3" -- 기능. 디버그 도우미.키를 사용한 콘트(테이블, 키 구분 기호, 구분자) 키 구분 기호 = 키 구분 기호 또는 ' = ' 구분자 = 구분자 또는 ', ' 현지의 불평이 많은 = '' 현지의 i = 1 현지의 첫번째 = 진실의 현지의 명명되지 않은 인수 = 진실의 위해서 k, v 에 쌍들(테이블) 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 나다 한다면 첫번째 그리고나서 첫번째 = 거짓의 또 다른 불평이 많은 = 불평이 많은 .. 구분자 끝. 한다면 k == i 그리고. 명명되지 않은 인수 그리고나서 i = i + 1 불평이 많은 = 불평이 많은 .. 끈으로 묶는(v) 또 다른 명명되지 않은 인수 = 거짓의 불평이 많은 = 불평이 많은 .. 끈으로 묶는(k) .. 키 구분 기호 .. 끈으로 묶는(v) 끝. 끝. 돌아가다 불평이 많은 끝. ------------------------------------------------------------------------------- 두 테이블을 재귀적으로 비교합니다(테이블이 아닌 값도 올바르게 처리됨). @param ignoreFalse인 경우 메타테이블, t1.__eq는 비교에 사용됩니다. -- 기능. 디버그 도우미.딥 비교(t1, t2, 메타테이블 무시) 현지의 유형 1 = 유형(t1) 현지의 유형 2 = 유형(t2) 한다면 유형 1 ~= 유형 2 그리고나서 돌아가다 거짓의 끝. 한다면 유형 1 ~= '탁자' 그리고나서 돌아가다 t1 == t2 끝. 현지의 상투적인 = 배불리 먹다(t1) 한다면 것은 아니다. 메타테이블 무시 그리고. 상투적인 그리고. 상투적인.__eq 그리고나서 돌아가다 t1 == t2 끝. 위해서 k1, v1 에 쌍들(t1) 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 나다 현지의 v2 = t2[k1] 한다면 v2 == 영의 또는 것은 아니다. 디버그 도우미.딥 비교(v1, v2) 그리고나서 돌아가다 거짓의 끝. 끝. 위해서 k2, v2 에 쌍들(t2) 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 나다 한다면 t1[k2] == 영의 그리고나서 돌아가다 거짓의 끝. 끝. 돌아가다 진실의 끝. ------------------------------------------------------------------------------- 스택 정보에 오류를 발생시킵니다. @param 오류 세부 정보가 포함된 테이블 세부 정보 - 표시할 오류 메시지인 '텍스트' 키가 있어야 합니다. - '스택' 키가 스택 데이터와 함께 추가됩니다. - 및 파일/라인 번호가 있는 '소스' 키 - 오류 처리를 위해 메타테이블이 추가됩니다. -- 기능. 디버그 도우미.올리다(세부 사항, 수평의) 수평의 = (수평의 또는 1) + 1 세부 사항.추적하다 = debug.debugback('', 수평의) 세부 사항.원천 = string.match(세부 사항.추적하다, '^%s*stack 추적:%s*(%S*: )') 설정 가능한 테이블(기본값, { __tostring: function()은 details.text end를 반환합니다. -- }) 오류(세부 사항, 수평의) 끝. ------------------------------------------------------------------------------- 검정에 사용하면 해당 검정이 무시되고 건너뛴 카운트가 1씩 증가합니다. -- 기능. 스크리쿤을 유닛으로 이동:테스트 생략 표시() 디버그 도우미.올리다({스크리쿤을 유닛으로 이동 = 진실의, 건너뛴 = 진실의}, 3) 끝. ------------------------------------------------------------------------------- 무조건 검정 불합격 @param 메시지(선택 사항)테스트에 대한 설명 -- 기능. 스크리쿤을 유닛으로 이동:실패하다(메세지) 디버그 도우미.올리다({스크리쿤을 유닛으로 이동 = 진실의, 본문 = "테스트 실패", 메세지 = 메세지}, 2) 끝. ------------------------------------------------------------------------------- 입력이 참인지 확인합니다. @param 메시지(선택 사항)테스트에 대한 설명 -- 기능. 스크리쿤을 유닛으로 이동:참임 주장(실제., 메세지) 한다면 것은 아니다. 실제. 그리고나서 디버그 도우미.올리다({스크리쿤을 유닛으로 이동 = 진실의, 본문 = string.형식("%s가 참이라고 주장하지 못했습니다.", 끈으로 묶는(실제.)), 메세지 = 메세지}, 2) 끝. 끝. ------------------------------------------------------------------------------- 입력이 거짓인지 확인합니다. @param 메시지(선택 사항)테스트에 대한 설명 -- 기능. 스크리쿤을 유닛으로 이동:assertificate(실제., 메세지) 한다면 실제. 그리고나서 디버그 도우미.올리다({스크리쿤을 유닛으로 이동 = 진실의, 본문 = string.형식("%s가 false라고 주장하지 못했습니다.", 끈으로 묶는(실제.)), 메세지 = 메세지}, 2) 끝. 끝. ------------------------------------------------------------------------------- 입력 문자열에 필요한 문자열이 포함되어 있는지 확인합니다. @param 메시지(선택 사항)테스트에 대한 설명 @param 일반 검색은 ustring 패턴 대신 일반 문자열로 수행됩니다. -- 기능. 스크리쿤을 유닛으로 이동:assertStringContains(양식, s, 평지, 메세지) 한다면 유형(양식) ~= '끈' 그리고나서 디버그 도우미.올리다({ 스크리쿤을 유닛으로 이동 = 진실의, 본문 = mw.ustring.서식을("패턴 유형 오류(예상 문자열, %s을(를) 받았습니다.", 유형(양식)), 메세지 = 메세지 }, 2) 끝. 한다면 유형(s) ~= '끈' 그리고나서 디버그 도우미.올리다({ 스크리쿤을 유닛으로 이동 = 진실의, 본문 = mw.ustring.서식을("문자열 유형 오류(예상 문자열, %s을(를) 받았습니다.", 유형(s)), 메세지 = 메세지 }, 2) 끝. 한다면 것은 아니다. mw.ustring.찾아내다(s, 양식, 영의, 평지) 그리고나서 디버그 도우미.올리다({ 스크리쿤을 유닛으로 이동 = 진실의, 본문 = mw.ustring.서식을('%s 문자열에서 %s "%s "을(를) 찾지 못했습니다., 평지 그리고. "임의의 문자열" 또는 "스캐너덜너덜, 양식, s), 메세지 = 메세지 }, 2) 끝. 끝. ------------------------------------------------------------------------------- 입력 문자열에 필요한 문자열이 포함되어 있지 않은지 확인합니다. @param 메시지(선택 사항)테스트에 대한 설명 @param 일반 검색은 ustring 패턴 대신 일반 문자열로 수행됩니다. -- 기능. 스크리쿤을 유닛으로 이동:assertNotStringContains(양식, s, 평지, 메세지) 한다면 유형(양식) ~= '끈' 그리고나서 디버그 도우미.올리다({ 스크리쿤을 유닛으로 이동 = 진실의, 본문 = mw.ustring.서식을("패턴 유형 오류(예상 문자열, %s을(를) 받았습니다.", 유형(양식)), 메세지 = 메세지 }, 2) 끝. 한다면 유형(s) ~= '끈' 그리고나서 디버그 도우미.올리다({ 스크리쿤을 유닛으로 이동 = 진실의, 본문 = mw.ustring.서식을("문자열 유형 오류(예상 문자열, %s을(를) 받았습니다.", 유형(s)), 메세지 = 메세지 }, 2) 끝. 현지의 i, j = mw.ustring.찾아내다(s, 양식, 영의, 평지) 한다면 i 그리고나서 현지의 경기 = mw.ustring.후보선수(s, i, j) 디버그 도우미.올리다({ 스크리쿤을 유닛으로 이동 = 진실의, 본문 = mw.ustring.서식을('%s "에 대해 "%s" 일치하는 항목을 찾았습니다., 경기, 평지 그리고. "임의의 문자열" 또는 "스캐너덜너덜, 양식), 메세지 = 메세지 }, 2) 끝. 끝. ------------------------------------------------------------------------------- 입력에 예상 값이 있는지 확인합니다. @param 메시지(선택 사항)테스트에 대한 설명 @예: assertEquals(4, add(2,2), "2+2는 4이어야 합니다") -- 기능. 스크리쿤을 유닛으로 이동:평등을 주장합니다.(기대됩니다, 실제., 메세지) 한다면 유형(기대됩니다) == '숫자' 그리고. 유형(실제.) == '숫자' 그리고나서 자신:델타 내에서 주장(기대됩니다, 실제., 1e-8, 메세지) 그렇지 않으면 기대됩니다 ~= 실제. 그리고나서 디버그 도우미.올리다({ 스크리쿤을 유닛으로 이동 = 진실의, 본문 = string.형식("%s가 예상되는 %s과(와) 일치하는지 확인하지 못했습니다.", 끈으로 묶는(실제.), 끈으로 묶는(기대됩니다)), 실제. = 실제., 기대됩니다 = 기대됩니다, 메세지 = 메세지, }, 2) 끝. 끝. ------------------------------------------------------------------------------- 입력에 예상 값이 없는지 확인합니다. @param 메시지(선택 사항)테스트에 대한 설명 @예: assertNotEquals(5, add(2,2), "2+2"는 5가 아니어야 함) -- 기능. 스크리쿤을 유닛으로 이동:동일하지 않음을 주장(기대됩니다, 실제., 메세지) 한다면 유형(기대됩니다) == '숫자' 그리고. 유형(실제.) == '숫자' 그리고나서 자신:델타 내에 없음 주장(기대됩니다, 실제., 1e-8, 메세지) 그렇지 않으면 기대됩니다 == 실제. 그리고나서 디버그 도우미.올리다({ 스크리쿤을 유닛으로 이동 = 진실의, 본문 = string.형식("%s가 예상 %s과(와) 같지 않다고 주장하지 못했습니다.", 끈으로 묶는(실제.), 끈으로 묶는(기대됩니다)), 실제. = 실제., 기대됩니다 = 기대됩니다, 메세지 = 메세지, }, 2) 끝. 끝. ------------------------------------------------------------------------------- 예상 값과 실제 값이 모두 숫자인지 확인합니다. @param 메시지(선택 사항)테스트에 대한 설명 -- 현지의 기능. 유효성 검사 번호(기대됩니다, 실제., 메세지) 한다면 유형(기대됩니다) ~= "숫자" 그리고나서 디버그 도우미.올리다({ 스크리쿤을 유닛으로 이동 = 진실의, 본문 = string.형식("기대값 %s이(가) 숫자가 아닙니다.", 끈으로 묶는(기대됩니다)), 실제. = 실제., 기대됩니다 = 기대됩니다, 메세지 = 메세지, }, 3) 끝. 한다면 유형(실제.) ~= "숫자" 그리고나서 디버그 도우미.올리다({ 스크리쿤을 유닛으로 이동 = 진실의, 본문 = string.형식("실제 값 %s이(가) 숫자가 아닙니다.", 끈으로 묶는(실제.)), 실제. = 실제., 기대됩니다 = 기대됩니다, 메세지 = 메세지, }, 3) 끝. 끝. ------------------------------------------------------------------------------- '실제'가 'expected'의 'delta' 내에 있는지 확인합니다. @param 메시지(선택 사항)테스트에 대한 설명 @확실한 단언.델타 내(1/3, 3/9, 0.000001, "3/9는 1/3"이어야 함) 기능. 스크리쿤을 유닛으로 이동:델타 내에서 주장(기대됩니다, 실제., 삼각주, 메세지) 유효성 검사 번호(기대됩니다, 실제., 메세지) 현지의 차이가 있는 = 기대됩니다 - 실제. 한다면 차이가 있는 < 0 그리고나서 차이가 있는 = - 차이가 있는 끝. math.abs를 가져오는 대신 한다면 차이가 있는 > 삼각주 그리고나서 디버그 도우미.올리다({ 스크리쿤을 유닛으로 이동 = 진실의, 본문 = string.형식("%f가 예상 %f의 %f 이내에 있다고 주장하지 못했습니다.", 실제., 삼각주, 기대됩니다), 실제. = 실제., 기대됩니다 = 기대됩니다, 메세지 = 메세지, }, 2) 끝. 끝. ------------------------------------------------------------------------------- '실제'가 'expected'의 'delta' 내에 있지 않은지 점검합니다. @param 메시지(선택 사항)테스트에 대한 설명 @예: assertNotWithDelta(1/3, 2/3, 0.000001, "1/3은 2/3이 되어서는 안 됩니다") 기능. 스크리쿤을 유닛으로 이동:델타 내에 없음 주장(기대됩니다, 실제., 삼각주, 메세지) 유효성 검사 번호(기대됩니다, 실제., 메세지) 현지의 차이가 있는 = 기대됩니다 - 실제. 한다면 차이가 있는 < 0 그리고나서 차이가 있는 = - 차이가 있는 끝. math.abs를 가져오는 대신 한다면 차이가 있는 <= 삼각주 그리고나서 디버그 도우미.올리다({ 스크리쿤을 유닛으로 이동 = 진실의, 본문 = string.형식("%f가 예상 %f의 %f 이내에 있지 않다고 주장하지 못했습니다.", 실제., 삼각주, 기대됩니다), 실제. = 실제., 기대됩니다 = 기대됩니다, 메세지 = 메세지, }, 2) 끝. 끝. ------------------------------------------------------------------------------- 테이블에 기대값(하위 테이블 포함)이 있는지 확인합니다. @param 메시지(선택 사항)테스트에 대한 설명 @예: assert DeepEquals({1,3}, {2,4}), 파티션(홀수, {1,2,3,4}) 기능. 스크리쿤을 유닛으로 이동:딥이퀄(DeepEquals(기대됩니다, 실제., 메세지) 한다면 것은 아니다. 디버그 도우미.딥 비교(기대됩니다, 실제.) 그리고나서 한다면 유형(기대됩니다) == '탁자' 그리고나서 기대됩니다 = mw.덤프 개체(기대됩니다) 끝. 한다면 유형(실제.) == '탁자' 그리고나서 실제. = mw.덤프 개체(실제.) 끝. 디버그 도우미.올리다({ 스크리쿤을 유닛으로 이동 = 진실의, 본문 = string.형식("%s가 예상되는 %s과(와) 일치하는지 확인하지 못했습니다.", 끈으로 묶는(실제.), 끈으로 묶는(기대됩니다)), 실제. = 실제., 기대됩니다 = 기대됩니다, 메세지 = 메세지, }, 2) 끝. 끝. ------------------------------------------------------------------------------- 처리 후 Wiki 텍스트가 예상 결과를 제공하는지 확인합니다. @param 메시지(선택 사항)테스트에 대한 설명 @예시 assert ResultEquals("Hello world", "{concat hello world}})" 기능. 스크리쿤을 유닛으로 이동:결과를 동일하게 주장(기대됩니다, 본문, 메세지) 현지의 틀 = 자신.틀 현지의 실제. = 틀:전처리(본문) 한다면 기대됩니다 ~= 실제. 그리고나서 디버그 도우미.올리다({ 스크리쿤을 유닛으로 이동 = 진실의, 본문 = string.형식("사전 처리 후 %s이(가) 예상 %s과(와) 일치하는지 확인하지 못했습니다.", 본문, 끈으로 묶는(기대됩니다)), 실제. = 실제., 실제 원시 = 본문, 기대됩니다 = 기대됩니다, 메세지 = 메세지, }, 2) 끝. 끝. ------------------------------------------------------------------------------- 처리 후 두 개의 위키 텍스트가 동일한 결과를 제공하는지 확인합니다. @param 메시지(선택 사항)테스트에 대한 설명 @예시 sameResult("{concat Hello world}"), "{deleteLastChar Hello world!}}") 기능. 스크리쿤을 유닛으로 이동:동일한 결과 주장(텍스트 1, 텍스트 2, 메세지) 현지의 틀 = 자신.틀 현지의 처리됨1 = 틀:전처리(텍스트 1) 현지의 가공2 = 틀:전처리(텍스트 2) 한다면 처리됨1 ~= 가공2 그리고나서 디버그 도우미.올리다({ 스크리쿤을 유닛으로 이동 = 진실의, 본문 = string.형식("사전 처리 후 %s이(가) 예상 %s과(와) 일치하는지 확인하지 못했습니다.", 처리됨1, 가공2), 실제. = 처리됨1, 실제 원시 = 텍스트 1, 기대됩니다 = 가공2, 예상 원시 = 텍스트 2, 메세지 = 메세지, }, 2) 끝. 끝. ------------------------------------------------------------------------------- 파서 함수가 예상 출력을 제공하는지 확인합니다. @param 메시지(선택 사항)테스트에 대한 설명 @예: assertParserFunctionEquals("Hello world", "msg:concat", {"Hello", "world"}) 기능. 스크리쿤을 유닛으로 이동:구문 분석기 함수 동일성 주장(기대됩니다, pfname, 논병아리, 메세지) 현지의 틀 = 자신.틀 현지의 실제. = 틀:콜 파서 함수{ 이름. = pfname, 논병아리 = 논병아리} 한다면 기대됩니다 ~= 실제. 그리고나서 디버그 도우미.올리다({ 스크리쿤을 유닛으로 이동 = 진실의, 본문 = string.형식("인수가 %s인 %s이(가) 사전 처리 후 예상 %s과(와) 동일한지 확인하지 못했습니다.", 디버그 도우미.키를 사용한 콘트(논병아리), pfname, 기대됩니다), 실제. = 실제., 실제 원시 = pfname, 기대됩니다 = 기대됩니다, 메세지 = 메세지, }, 2) 끝. 끝. ------------------------------------------------------------------------------- 템플릿이 예상 출력을 제공하는지 확인합니다. @param 메시지(선택 사항)테스트에 대한 설명 @확실한 단언.템플릿 동등("Hello world", "concat", {"Hello", "world"}) 기능. 스크리쿤을 유닛으로 이동:템플릿 동일성 확보(기대됩니다, 템플릿, 논병아리, 메세지) 현지의 틀 = 자신.틀 현지의 실제. = 틀:확장템플릿{ 제목 = 템플릿, 논병아리 = 논병아리} 한다면 기대됩니다 ~= 실제. 그리고나서 디버그 도우미.올리다({ 스크리쿤을 유닛으로 이동 = 진실의, 본문 = string.형식("인수가 %s인 %s이(가) 사전 처리 후 예상 %s과(와) 동일한지 확인하지 못했습니다.", 디버그 도우미.키를 사용한 콘트(논병아리), 템플릿, 기대됩니다), 실제. = 실제., 실제 원시 = 템플릿, 기대됩니다 = 기대됩니다, 메세지 = 메세지, }, 2) 끝. 끝. ------------------------------------------------------------------------------- 함수가 오류를 발생시키는지 확인합니다. @paramfn 테스트할 함수 @param expectedMessage 옵션 예상 오류 메시지 @param 메시지(선택 사항)테스트에 대한 설명 기능. 스크리쿤을 유닛으로 이동:스로우즈를 주장합니다.(에프앤, 예상 메시지, 메세지) 현지의 성공했다, 실제 메시지 = pcall(에프앤) 한다면 성공했다 그리고나서 디버그 도우미.올리다({ 스크리쿤을 유닛으로 이동 = 진실의, 본문 = '예외가 예상되었지만 아무 것도 던져지지 않았습니다.', 메세지 = 메세지, }, 2) 끝. 문자열의 경우 오류 메시지에 추가된 라인 번호를 제거합니다. 실제 메시지 = 유형(실제 메시지) == '끈' 그리고. string.match(실제 메시지, '모듈:[^:]*:[0-9]*: (.*)') 또는 실제 메시지 현지의 메시지일치 = 디버그 도우미.딥 비교(예상 메시지, 실제 메시지) 한다면 예상 메시지 그리고. 것은 아니다. 메시지일치 그리고나서 디버그 도우미.올리다({ 스크리쿤을 유닛으로 이동 = 진실의, 기대됩니다 = 예상 메시지, 실제. = 실제 메시지, 본문 = string.형식('%s 메시지에 예외가 있어야 하지만 %s 메시지가 표시됨', 끈으로 묶는(예상 메시지), 끈으로 묶는(실제 메시지) ), 메세지 = 메세지 }, 2) 끝. 끝. ------------------------------------------------------------------------------- 함수가 오류를 발생시키지 않는지 확인합니다. @paramfn 테스트할 함수 @param 메시지(선택 사항)테스트에 대한 설명 기능. 스크리쿤을 유닛으로 이동:Assert Does Not Throw(에프앤, 메세지) 현지의 성공했다, 실제 메시지 = pcall(에프앤) 한다면 성공했다 그리고나서 돌아가다 끝. 문자열의 경우 오류 메시지에 추가된 라인 번호를 제거합니다. 실제 메시지 = 유형(실제 메시지) == '끈' 그리고. string.match(실제 메시지, '모듈:[^:]*:[0-9]*: (.*)') 또는 실제 메시지 디버그 도우미.올리다({ 스크리쿤을 유닛으로 이동 = 진실의, 실제. = 실제 메시지, 본문 = string.형식('예외가 필요하지 않지만 %s 메시지와 함께 예외가 발생했습니다., 끈으로 묶는(실제 메시지) ), 메세지 = 메세지 }, 2) 끝. ------------------------------------------------------------------------------- 새 테스트 세트를 만듭니다. @paramo table with test functions(테스트 기능이 포함된 테이블)(또는 나중에 반환된 제품군에 기능을 추가할 수 있음 -- 기능. 스크리쿤을 유닛으로 이동:신규(o) o = o 또는 {} o._지루한 = {} 상을 차리다(o, { __index = 자신, __new 인덱스 = 기능. (t, k, v) 한다면 유형(k) == "문자열" 그리고. k:찾아내다('^test') 그리고. 유형(v) == "함수" 그리고나서 정의된 순서대로 테스트 함수 저장 표.삽입(o._지루한, {이름. = k, 시험 = v}) 또 다른 미가공의(t, k, v) 끝. 끝. }) o.달려. = 기능.(틀) 돌아가다 자신:달려.(o, 틀) 끝. 돌아가다 o 끝. ------------------------------------------------------------------------------- 글로벌 카운터를 재설정합니다. -- 기능. 스크리쿤을 유닛으로 이동:안에(틀) 자신.틀 = 틀 또는 mw.현재 프레임 가져오기() 자신.성공 횟수 = 0 자신.실패 횟수 = 0 자신.개수 건너뛰기 = 0 자신.결과. = {} 끝. ------------------------------------------------------------------------------- 단일 테스트 사례 실행 @param 이름 테스트 번호 @인수를 포함하는 매개변수 테스트 함수 -- 기능. 스크리쿤을 유닛으로 이동:테스트 실행(스위트룸, 이름., 시험) 현지의 성공., 세부 사항 = pcall(시험, 스위트룸) 한다면 성공. 그리고나서 자신.성공 횟수 = 자신.성공 횟수 + 1 표.삽입(자신.결과., {이름. = 이름., 성공. = 진실의}) 그렇지 않으면 유형(세부 사항) ~= '탁자' 또는 것은 아니다. 세부 사항.스크리쿤을 유닛으로 이동 그리고나서 실패한 주장이 아닌 진짜 오류 자신.실패 횟수 = 자신.실패 횟수 + 1 표.삽입(자신.결과., {이름. = 이름., 오류 = 진실의, 메세지 = '루아 오류 --' .. 끈으로 묶는(세부 사항)}) 그렇지 않으면 세부 사항.건너뛴 그리고나서 자신.개수 건너뛰기 = 자신.개수 건너뛰기 + 1 표.삽입(자신.결과., {이름. = 이름., 건너뛴 = 진실의}) 또 다른 자신.실패 횟수 = 자신.실패 횟수 + 1 현지의 메세지 = 세부 사항.원천 또는 "" 한다면 세부 사항.메세지 그리고나서 메세지 = 메세지 .. 세부 사항.메세지 .. "\n" 끝. 메세지 = 메세지 .. 세부 사항.본문 표.삽입(자신.결과., {이름. = 이름., 오류 = 진실의, 메세지 = 메세지, 기대됩니다 = 세부 사항.기대됩니다, 실제. = 세부 사항.실제., 시험명 = 세부 사항.메세지}) 끝. 끝. ------------------------------------------------------------------------------- 모든 테스트를 실행하고 결과를 표시합니다. -- 기능. 스크리쿤을 유닛으로 이동:제품군 실행(스위트룸, 틀) 자신:안에(틀) 위해서 i, 테스트 세부 정보 에 짝을 짓다(스위트룸._지루한) 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 나다 자신:테스트 실행(스위트룸, 테스트 세부 정보.이름., 테스트 세부 정보.시험) 끝. 돌아가다 { 성공 횟수 = 자신.성공 횟수, 실패 횟수 = 자신.실패 횟수, 개수 건너뛰기 = 자신.개수 건너뛰기, 결과. = 자신.결과., } 끝. ------------------------------------------------------------------------------- #테스트를 실행할 수 있는 진입점입니다. 프레임 없이 호출할 수 있으며, 이 경우 출력에 mw.log를 사용합니다. @param displayMode표시 결과() 참조 -- 기능. 스크리쿤을 유닛으로 이동:달려.(스위트룸, 틀) 현지의 테스트 데이터 = 자신:제품군 실행(스위트룸, 틀) 한다면 틀 그리고. 틀.논병아리 그리고나서 돌아가다 자신:표시결과(테스트 데이터, 틀.논병아리.디스플레이 모드 또는 '탁자') 또 다른 돌아가다 자신:표시결과(테스트 데이터, '로그') 끝. 끝. ------------------------------------------------------------------------------- 테스트 결과를 표시합니다. @param displayMode: 'table', 'log' 또는 'short' -- 기능. 스크리쿤을 유닛으로 이동:표시결과(테스트 데이터, 디스플레이 모드) 한다면 디스플레이 모드 == '탁자' 그리고나서 돌아가다 자신:결과를 표로 표시(테스트 데이터) 그렇지 않으면 디스플레이 모드 == '로그' 그리고나서 돌아가다 자신:결과를 로그로 표시(테스트 데이터) 그렇지 않으면 디스플레이 모드 == '짧은' 그리고나서 돌아가다 자신:결과를 짧게 표시(테스트 데이터) 또 다른 오류('표시 모드 전환') 끝. 끝. 기능. 스크리쿤을 유닛으로 이동:결과를 로그로 표시(테스트 데이터) 한다면 테스트 데이터.실패 횟수 > 0 그리고나서 mw.로그.('실패!!!') 그렇지 않으면 테스트 데이터.개수 건너뛰기 > 0 그리고나서 mw.로그.('일부 테스트는 프레임 없이 실행할 수 없으며 건너뛰었습니다.이 테스트 제품군을 템플릿으로 호출하여 모든 테스트를 실행합니다.') 끝. mw.로그.(string.형식('인수: 성공: %d, 오류: %d, 건너뛰기: %d', 테스트 데이터.성공 횟수, 테스트 데이터.실패 횟수, 테스트 데이터.개수 건너뛰기)) mw.로그.('-------------------------------------------------------------------------------') 위해서 _, 결과 에 짝을 짓다(테스트 데이터.결과.) 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 나다 한다면 결과.오류 그리고나서 mw.로그.(string.형식('%s: %s', 결과.이름., 결과.메세지)) 끝. 끝. 끝. 기능. 스크리쿤을 유닛으로 이동:결과를 짧게 표시(테스트 데이터) 현지의 본문 = string.형식(cfg.짧은 결과 형식, 테스트 데이터.성공 횟수, 테스트 데이터.실패 횟수, 테스트 데이터.개수 건너뛰기) 한다면 테스트 데이터.실패 횟수 > 0 그리고나서 본문 = '<span class="error">' .. 본문 .. '/span' 끝. 돌아가다 본문 끝. 기능. 스크리쿤을 유닛으로 이동:결과를 표로 표시(테스트 데이터) 현지의 성공 아이콘, 실패 아이콘 = 자신.틀:전처리(cfg.성공 지표), 자신.틀:전처리(cfg.고장 표시기) 현지의 본문 = '' 한다면 테스트 데이터.실패 횟수 > 0 그리고나서 현지의 메시지 = mw.메세지.새 원시 메시지(cfg.실패 요약, 테스트 데이터.실패 횟수):평지() 메시지 = 자신.틀:전처리(메시지) 한다면 cfg.실패 카테고리 그리고나서 메시지 = cfg.실패 카테고리 .. 메시지 끝. 본문 = 본문 .. 실패 아이콘 .. ' ' .. 메시지 .. '\n' 또 다른 본문 = 본문 .. 성공 아이콘 .. ' ' .. cfg.성공 요약 .. '\n' 끝. 본문 = 본문 .. class="테스트 테이블에 쓰기 적합하지 않은 스크리빙"\n' 본문 = 본문 .. '!\n! ' .. cfg.nameString .. '\n! ' .. cfg.예상 문자열 .. '\n! ' .. cfg.실제 문자열 .. '\n' 위해서 _, 결과 에 짝을 짓다(테스트 데이터.결과.) 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 나다 본문 = 본문 .. ' -\n' 한다면 결과.오류 그리고나서 본문 = 본문 .. ' ' .. 실패 아이콘 .. '\n' 한다면 (결과.기대됩니다 그리고. 결과.실제.) 그리고나서 현지의 이름. = 결과.이름. 한다면 결과.시험명 그리고나서 이름. = 이름. .. ' / ' .. 결과.시험명 끝. 본문 = 본문 .. mw.본문.노비키(이름.) .. '\n' .. mw.본문.노비키(끈으로 묶는(결과.기대됩니다)) .. '\n' .. mw.본문.노비키(끈으로 묶는(결과.실제.)) .. '\n' 또 다른 본문 = 본문 .. mw.본문.노비키(결과.이름.) .. '\n' .. colspan="2" ' .. mw.본문.노비키(결과.메세지) .. '\n' 끝. 또 다른 본문 = 본문 .. ' ' .. 성공 아이콘 .. '\n' .. mw.본문.노비키(결과.이름.) .. '\n \n \n' 끝. 끝. 본문 = 본문 .. ' }\n' 돌아가다 본문 끝. 돌아가다 스크리쿤을 유닛으로 이동