2011-08-30 6 views
1

나는 지금 조금씩 몰을 사용 해왔다.몰 (Moles)과의 큰 배치 단계를 가진 러닝 유닛 테스트가 느리다.

그러나보다 광범위한 배치 작업이 필요한 단위 테스트를 처리 할 때 단위 테스트는 전적으로 걸립니다.

HostType ("Moles") 속성을 지정하지 않고 단위 테스트 코드를 실행하면 배열 작업이 < (호스트 이름 (A) 2 초 사이에 10 초)가됩니다. Moles 호스트 속성을 추가하면이 시간이 약 4-5 분으로 확장됩니다.

무슨 일이 벌어지고 있으며 어떻게해야합니까?

---- BryanBCook의 답변과 관련하여 업데이트되었습니다.

다음은 문제가있는 코드입니다 (약간 수정 됨). 문제가 일리노이의 재 작성이라면 필자는 기대하지 않는 곳에서 일어난 것처럼 보인다. 그것이 모든 것을 다시 쓰는지 아십니까? 나는 또한 두더지 호스트 프로세스에서 스케일링 문제가 있는지 궁금하다.

[ClassInitialize()] 
public static void ClassInit(TestContext ctx) 
{ 

    Common.Logging.Moles.MExceptionEvent.LogExceptionStringStringStringString = delegate(Exception ex, string a, string b, string c, string d) 
    { 
     Debug.WriteLine(String.Format("Exception occurred in test context '{0}' : {1} ", ctx.TestName, ex.ToString())); 
    }; 

    Common.Logging.Moles.MCriticalEvent.LogStringStringTraceEventTypeStringString = delegate(string a, string b, TraceEventType tet, string c, string d) 
    { 
     Debug.WriteLine(String.Format("Critical Event occurred in test context '{0}' : {1} ", ctx.TestName, a)); 
    }; 

    Common.Logging.Moles.MDebugEvent.LogStringStringTraceEventTypeStringString = delegate(string a, string b, TraceEventType tet, string c, string d) 
    { 
     //Debug.WriteLine(String.Format("Debug Event occurred in test context '{0}' : {1} ", ctx.TestName, a)); 
    }; 

/*there are about 1MM lines of code that generate this dataset.*/ 
    DataSet _ds = dg.STDDataHelper.GenerateDataSet(); 

/*This is where the delay occurs*/ 
    m_std = new STD(_ds); 

/*Now another object (implements web caching) gets moled to use the newly constructed object*/ 
    BizObjects.Moles.MSCO.STDs = delegate() 
    { 
     return m_std; 

    }; 


    m_co1 = new Company(dg.Company.CTSDataHelper.COMPANY_ONE_CODE); 
    m_co1.HydrateCoTaxDefinitions(dg.Company.CTSDataHelper.GenerateCompanyOneDataset()); 
    m_co2 = new Company(dg.Company.CTSDataHelper.COMPANY_ONE_CODE); 
    m_co2.HydrateCoTaxDefinitions(dg.Company.CTSDataHelper.GenerateCompanyTwoDataset()); 

} 

---

그래서 STD가 초기화됩니다 후 로깅 몰 일어날 수 있도록 클래스 초기화를 정리하고 전체 STD 객체의 3 디버그 로깅 문을 (그들이 정말 쓸모)를 제거하는 또 다른 갱신 건설 나무는 약 1 분 30 초로 배열 작업을 줄였습니다.

이것은 최적이 아니지만 (STD 객체 트리 구조의 예외는 테스트되는 실제 테스트가 아니라 테스트가 실패 할 것입니다.), 여전히이 페널티를 지불하는 것보다 낫습니다. 특히 시공 입력이 엄격하게 관리되기 때문에 특히 그렇습니다.

그런데, 나는 두더지 호스트 프로세스가 약 138MB의 램과 13 %의 프로세서만을 사용한다는 것을 알았습니다. 두더지가 없으면 (그리고 단위 테스트에 모든 의존성 추가), 표준 호스트는 그 이상을 사용할 것입니다 (이 comp은 i7 Quad와 8GB 램을 가지고 있습니다 - 여유 공간이 충분합니다). 두더지 호스트 프로세스가 일종의 한계를 넘는 것처럼 보입니다.

+0

대답이 대답 할 때, 그것은 느리고 Moles에서도 잘 설명되어 있습니다. – leppie

+0

내가 말했듯이, 우리 (14 명)는 아마도이 테스트를위한 1.5 분의 설치 시간을 다룰 수 있습니다. (잘하면 "productized"버전의 pex/moles가 조금 더 효과적입니다.) 나는 정말로 새로운 질문 영역으로 벤처하기 시작 했으므로 나는이 문제에 대해 어슬렁 거리지 않을 것이다. – StingyJack

+0

상용 제품을 구입 한 경우 TypeMock Isolator (http://www.typemock.com/isolator-product-page)도 참고하십시오. 성능이 현명 할 수도 있습니다. 불행히도, Moles는 일리노이 다시 작성을 수행하는 유일한 무료 mocker입니다. :( – leppie

답변

2

Moles가 느리게 실행되는 이유는 ProfilerAPI를 사용하여 IL을 가로 채고 다시 작성하기 때문입니다. 코드 적용 범위를 사용하도록 설정된 상태에서 또는 Visual Studio 2010의 TestImpact 기능을 사용하여 테스트를 실행하면 비슷한 속도로 느려집니다. 평균 테스트에서는 4-5 배 더 오래 걸립니다.

4-10 분이 극단적 인 것처럼 보입니다. 제 생각에 코드 커버리지를 가진 테스트와 Moles를 실행하는 것의 차이는 코드 커버리지를 위해 계측과 테스트를위한 설정이 한 번 발생한다는 것입니다. 이것이 바로 많은 지연이 발생하는 곳입니다. Moles의 경우 ProfilerAPI를 초기화하는 데 드는 설치 비용이 고정되어 있으며 각 테스트마다 발생할 수 있습니다.

+0

통찰력을 가져 주셔서 감사합니다. 그러나 그것은 몇 가지 질문으로 이어졌습니다. – StingyJack

+0

범위가 약간의 질문에 들어온다, 위의 의견을 무시하십시오. 당신의 대답은 제가 실제로 가지고있는 문제에 대한 유용한 해결책을 찾는 데 도움이되었습니다. – StingyJack