간단한 수정으로 해결된 하드 버그
14646 단어 opensource
CI에서 테스트 사례는 Chromium에서만 실패했습니다.
FAIL browser: chromium src/api/sso/test/e2e/auth-flows.test.js (28.142 s)
Authentication Flows
✕ Login flow preserves state param (25222 ms)
첫째, 내 리뷰어 중 일부는 Mac M1(ARM 아키텍처)을 사용하고 있는데, 이미지를 빌드하기 위한 일부 빌드인 패키지가 누락되었기 때문에 node-alpine 버전 이후로 이미지를 제대로 빌드할 수 없었습니다. 더 큰 노드 버전을 사용해야 했습니다.
이러한 변경 사항을 푸시한 후@humphd 디버깅에 도움이 되었지만 이 문제는 로컬에서 생성할 수 없었습니다.
나는 다른 환경에서 실행하기 시작했고 이것은 다음과 같은 결과입니다.
Windows 11 pro 21H2 - 테스트 케이스 통과. (@Kevan-Y 작성)
WSL2 Ubuntu-20.04의 Windows 11 pro 21H2 - 테스트 사례 통과(@Kevan-Y 제공)
Amazon Linux 2 AMI(HVM) - 커널 5.10(ami-0c02fb55956c7d316(64비트 x86)) - t2.large - 테스트 케이스 통과(@Kevan-Y 제공)
MacOS M1 - 테스트 사례 통과(@humphd 제공)
좋지 않았습니다. 이것은 CI에서만 발생하기 때문에 디버깅을 어렵게 만듭니다.
테스트 케이스의 시간 제한을 30000ms로 늘리기 시작했습니다.
it('Login flow preserves state param', async () => {
const { state } = await login(page, 'user1', 'user1pass');
// Expect the state to match what we sent originally (see index.html <a>)
expect(state).toEqual('abc123');
}, 30000);
시간 초과 증가에도 불구하고 실패했습니다.
탄력적 검색과 같은 다른 컨테이너로 인해 충돌이 발생했을 수 있습니다. 해당 컨테이너에 할당된 메모리가 충분하지 않은 문제가 있었기 때문입니다. docker-compose 파일의 메모리를 늘렸습니다.
elasticsearch:
environment:
# Limit the initial heap size. By default it will use 1/4 of available RAM
- 'ES_JAVA_OPTS=-Xms512m -Xmx512m'
이러한 변경 사항을 추진한 후에도 CI 파이프라인은 여전히 실패했습니다.
나는 모든 e2e 테스트 사례를 건너뛰고 디버깅 목적으로
Login flow preserves state param
의 src/api/sso/test/e2e/auth-flows.test.js
만 실행하고 LOG_LEVEL
에서 debug
까지 켜기로 결정했습니다.이러한 변경 사항을 추진했지만 도움이 되지 않았습니다. 잘못된 위치를 식별하는 데 도움이 되는 0개의 로그였습니다. 그래서 기본 디버깅 방법으로 전환합니다. "각 줄에 console.log 넣기"
src\api\sso\test\e2e\auth-flows.test.js
에서 it('Login flow preserves state param', async () => {
console.log('Start test case by await login');
const { state } = await login(page, 'user1', 'user1pass');
console.log('Done await login', state);
// Expect the state to match what we sent originally (see index.html <a>)
expect(state).toEqual('abc123');
}, 30000);
src\api\sso\test\e2e\browser-util.js
에서const login = async (page, username, password) => {
console.log('Start login and wait for page');
// Click login button and then wait for the login page to load
await Promise.all([
page.waitForNavigation({
url: /simplesaml\/module\.php\/core\/loginuserpass\.php/,
waitUtil: 'networkidle',
}),
page.click('#login'),
]);
console.log('after click login');
console.log('click input[name="username"]');
// Fill the login form, star with username
await page.click('input[name="username"]');
console.log('after click input[name="username"]');
console.log('fill input[name="username"]');
await page.fill('input[name="username"]', username);
console.log('after fill input[name="username"]');
// Now enter the password
console.log('click input[name="password"]');
await page.click('input[name="password"]');
console.log('after click input[name="password"]');
console.log('fill input[name="password"]');
await page.fill('input[name="password"]', password);
console.log('after fill input[name="password"]');
console.log('wait for the new page to load');
// Click login button and then wait for the new page to load
await Promise.all([
page.waitForNavigation({
url: /^http:\/\/localhost:\d+\/auth\.html\?access_token=[^&]+&state=/,
waitUtil: 'load',
}),
page.click('text=/.*Login.*/'),
]);
// The token and state will get returned on the query string
return getTokenAndState(page);
};
이 변경 사항을 추진한 후 마침내 좋은 디버그 결과를 얻었습니다. 테스트 케이스가 시간 초과되었습니다.
await Promise.all([
page.waitForNavigation({
url: /simplesaml\/module\.php\/core\/loginuserpass\.php/,
waitUtil: 'networkidle',
}),
page.click('#login'),
]);
@Humphd에서 언급한 한 가지 가능한 문제는 이벤트가 어떤 이유로 해당 페이지에 있었고 탐색하지 않는 것입니다.
waitUtil: 'networkidle'
대신 waitUtil: 'load'
로 변경합니다. see reference그렇다고 해도 소용없었다. 그러나 궁극적인 해결책은 잠재적으로 문제를 해결할 수 있는
1.19.2
의 버전1.20.2
에서 playwright
로 업데이트를 시도하는 것이었습니다.그것은 올바른 솔루션이었고 종속성의 업데이트였으며 모든 것이 잘 작동합니다.
이것을 디버깅하기 위해 며칠을 보냈고 수정 사항은 종속성 업데이트였습니다. 결국 좋은 경험이었습니다. 때로는 업스트림이 우리를 위해 수정될 때까지 기다려야 합니다.
Reference
이 문제에 관하여(간단한 수정으로 해결된 하드 버그), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/pandanoxes/hard-bug-fixed-by-a-simple-fix-2p9a텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)