테스트 제품군의 일부로 모든 것을 모의하고 데이터베이스 연결이 필요하지 않은 단위 테스트 옆에 데이터베이스가 필요한 통합 테스트도 있습니다.
우리는 많은 레거시 코드로 작업하고 있으며 높은 수준의 테스트를 수행할 수 있는 가능성을 제공하기 때문에 통합 테스트가 필요합니다.
설정
데이터베이스는 모든 최신 Windows 업데이트가 포함된 Windows Server 2008 R2 시스템에서 실행되는 SQL Server 2008 R2입니다. OS와 SQL Server 모두에 해당됩니다.
데이터베이스 서버를 실행하는 VM은 우리 빌드 인프라의 일부이며, 물론 이미지를 기반으로 매일 아침 6시에 새로 생성되고 오후 10시에 파괴됩니다. 그래서 저는 SQL Server 에이전트와 서비스가 본질적으로새로운그리고 매일 시작했다. 첫 번째 빌드는 오전 7시에 발생하므로 머신이 모든 서비스를 시작하고 로드할 충분한 시간을 제공합니다.
데이터베이스 서버는 무제한 연결을 허용하도록 구성되었으며 명명된 파이프 및 TCP 연결이 활성화되었습니다.
데이터베이스에 대한 연결은 다음을 통해 이루어집니다.사사용자.
프로덕션 데이터베이스의 축소된 스냅샷이 있습니다.a.mdf여기에는 테스트를 수행하는 데 필요한 모든 테이블, 뷰, 저장 프로시저 및 최소 데이터 집합이 포함되어 있습니다.
통합 테스트가 실행되면 테스트 설정이 복사됩니다.a.mdfSQL Server 설치의 DATA 폴더에b.mdf. b.mdf는 다음 명령을 사용하여 데이터베이스에 연결됩니다.
CREATE DATABASE Foo ON (FILENAME = N'Path\To\b.mdf') FOR ATTACH
테스트가 실행되고, 데이터베이스 작업이 수행되며, 테스트 픽스처의 테스트 해체에서 데이터베이스가 분리되고 b.mdf 파일이 제거됩니다.
분리를 수행하기 위해 다음 두 명령이 개별적으로 실행됩니다.
ALTER DATABASE Foo SET SINGLE_USER WITH ROLLBACK IMMEDIATE
EXEC master.dbo.sp_detach_db @dbname = N'Foo'
따라서 실제로 다음과 같은 레이아웃의 테스트 픽스처 세트가 있습니다.
Setup();
Test_1();
Test_2();
Test_3();
TearDown();
각 설정은 새 데이터베이스를 생성하고, 모든 테스트를 실행하고, 데이터베이스를 제거하여 다음 텍스트 픽스처가 깨끗하고 새로운 데이터베이스로 시작되도록 합니다.
전체적으로 약 50개의 텍스트 픽스처가 있고 각 픽스처에는 10개의 테스트가 포함되어 있습니다. 따라서 데이터베이스 연결 및 분리가 50번 수행되고 약 500번의 테스트가 실행됩니다.
문제
지난 몇 주 동안 통합 테스트와 관련하여 실패한 빌드 수가 증가한 것을 확인했습니다. 전체 설정이 내 로컬 컴퓨터와 다른 개발자의 컴퓨터에서 완벽하게 작동하기 때문에 내 테스트가 괜찮다는 것을 알고 있습니다. 문제를 보고하는 것은 빌드 서버일 뿐입니다.
SetUp Error : Namespace.Class.Method
SetUp : System.Data.SqlClient.SqlException : Cannot open database "Foo" requested by the login. The login failed.
Login failed for user 'sa'.
분명히, 나는 구글을 검색했고 예, 로그인이 정확했습니다. 나는 그것이 항상 동일한 테스트가 실패하는 것은 아니기 때문에 그것을 알고 있습니다. 전체 테스트 스위트를 10번 실행하면 10번 중 8번은 실패하지만 실패를 보고하는 테스트는 매번 다릅니다. 오류 메시지는 동일하며 로그인할 수 없다는 내용이며 때로는 다음과 같은 내용도 보고됩니다.파이프의 다른 쪽 끝에는 프로세스가 없습니다..
또한 명명된 파이프와 TCP 연결이 활성화되어 있는지 확인하고, 허용된 연결 수를 확인하고, ERRORLOG 파일을 확인했지만 내 데이터베이스와 직접 관련된 내용이 포함되어 있지 않습니다.
내 생각엔 이상한 이유로 인해 속도가 빨라지거나 느려지고 데이터베이스를 제대로 연결하거나 분리할 수 없거나 호출이 SINGLE_USER
문제를 일으키는 것 같습니다. 제가 수집한 바에 따르면 로그인으로 인해 하나의 테스트가 실패하면 b.mdf 파일이 사용 중인 것 같아서 제거할 수 없습니다.
그래서 제 질문은 이렇습니다. 제가 시도할 수 있는 다른 것이 있나요? 더 많은 통찰력을 제공할 수 있는 오류 로그 파일이나 특정 메시지가 있습니까? 연결 및 분리가 성공했는지 확인하기 위해 할 수 있는 일이 있습니까? (분리 실패로 인해 로그인 문제가 발생할 가능성이 있습니까?) 분리 작업이 비동기식이므로 다음 호출이 이루어질 때 아직 완료되지 않았을 가능성이 있습니까?
답변1
첫 번째 문제: 로그인 실패 오류.
테스트가 실행될 때 데이터베이스가 아직 완전히 초기화되지 않았을 가능성이 높습니다.
프로시저에서 이를 포착해야 합니다. 이를 수행하는 쉬운 방법은 마스터 데이터베이스를 쿼리하여 대상 데이터베이스가 실행 중인지 확인하는 것입니다.
IF (select name from sys.databases
where name = 'foo' and state_desc = 'ONLINE' and is_in_standby = '0') IS NOT NULL
PRINT 'database not found';
두 번째 문제: 파이프의 다른 쪽 끝에는 프로세스가 없습니다.
실제로 이 오류 뒤에 있는 오류는 TCP/IP를 통해 연결하지 않으면 종종 모호해집니다.
직접 IP 연결을 활성화해 보거나 다른 오류에 집중할 수 있습니다. 이러한 오류가 이 오류의 원인일 가능성이 높습니다.