2012-07-09 5 views
1

메서드가 여러 스레드에서 호출 될 때 동시성 문제가 없음을 테스트하고 싶습니다. 나는이 메서드가 동시에 3 번 호출되고 동시성 문제가 없는지 확인하기 위해 2000 명의 고객을 내 캐시에 삽입하는 것을 시뮬레이션합니다. 이 테스트는 동시성 문제를 테스트하는 데 의미가 있습니까?

public void Should_Insert_2000_Customers_Using_Concurrency() 
{ 
    var fakeCustomers = InitCustomersFromDb(); 
    Action insertCustomersFrom_0_to_1000 = new Action(() => 
    { 
     Parallel.For(0, 1000, x => 
     { 
      CustomerCache.Instance.SetCustomer(x.ToString(), fakeCustomers[0]); 
     }); 

    }); 
    Action insertCustomersFrom_1000_to_2000 = new Action(() => 
    { 
     Parallel.For(1000, 2000, x => 
     { 
      CustomerCache.Instance.SetCustomer(x.ToString(), fakeCustomers[0]); 
     }); 
    }); 
    Action insertCustomersFrom_0_to_2000 = new Action(() => 
    { 
     Parallel.For(0, 2000, x => 
     { 
      CustomerCache.Instance.SetCustomer(x.ToString(), fakeCustomers[0]); 
     }); 
    }); 
    List<Task> tasks = new List<Task>(); 
    tasks.Add(Task.Factory.StartNew(insertCustomersFrom_0_to_1000)); 
    tasks.Add(Task.Factory.StartNew(insertCustomersFrom_1000_to_2000)); 
    tasks.Add(Task.Factory.StartNew(insertCustomersFrom_0_to_2000)); 

    Task.WaitAll(tasks.ToArray()); 
    var customers = CustomerCache.Instance.GetCustomers(); 
    Assert.That(customers.Count == 2000); 
} 

은 동시성 문제를 보여주는 효과적 일 내 CustomerCache에 대한 여러 개의 동시 Parallel.For 반복을 실행하는 것인가?

+2

그럼 궁금한 점은 무엇입니까? 코드 검토를 요청합니까? – slugster

+0

이러한 종류의 테스트가 멀티 스레딩을 테스트하는 것이 좋은지 알고 싶습니다. 아니면 쓸데없는 경우 ... – Florian

+0

Parallel.For asynchrone, 그래서 당신은 얼마나 많은 CPU의/코어에 따라 더 많은 스레드를 사용합니다. – Maarten

답변

1

테스트에서는 특정 시나리오를 테스트해야합니다. 동시성 테스트는 발생하기를 바라지 않고 동시성 문제를 만들어야합니다. 테스트에는 단일 실행이 필요합니다. 코드에서 어렵다면 테스트 가능한 코드보다 더 많은 기능적 코드가 있다는 것을 기억하십시오. 하지만 ... 위험을 줄이려면 ... 코드를 테스트 할 수있게 만들고 싶습니다.

그래서 '동시성'이 의미하는 바를 찾아 내고이를 실현하십시오. 독단적 이군. 방법을 호출하고 호출하는 것을 조롱하십시오. 중요한 부분에 있음을 알려주는 무언가를 호출하면 조롱 프레임 워크를 사용하여 다른 호출을 호출합니다.

아마 지금 궁금한 "하지만 그게 여러 스레드를 의미합니다". 스레드는 개념이며 스레드를 만드는 데 사용 된 개체와 충돌을 처리하는 개체를 삽입합니다.

당신은 한두 줄을보고 생각해야합니다 .... "두명이 이걸 할 수 있어요". 경비원을 테스트하십시오.

3

IMO,이 종류의 테스트는별로 드러내지 않습니다. 이 특별한 경우에 결과가 최종적으로 정확하다는 것은 명백합니다. 그러나 컬렉션에 항목을 동시에 삽입하는 일반적인 경우에는 실제로 추가 된 항목의 수를 테스트하는 것은 잘못된 것입니다. 기대는 데이터 경쟁이 어딘가에 있고 단지 "운이 좋다"는 가능성을 배제하지 않습니다.

관련 문제