인자 생성 제약 조건
동시성 데이터 구조를 테스트하기 위해, Lincheck은 연산을 서로 다른 스레드에 무작위로 배치하고 무작위 인자로 호출하여 일련의 동시성 시나리오를 생성합니다.
연산 인자의 범위를 제약함으로써 동시성 버그를 발견할 확률을 높일 수 있습니다. 예를 들어, 가능한 키 값의 범위가 제한되어 있으면 해시 맵의 동시 연산이 동일한 키에 접근할 가능성이 커집니다. 이를 통해 Lincheck은 경합 상태(race condition) 및 기타 동시성 버그를 더 효율적으로 노출할 수 있습니다.
Lincheck에서 생성되는 인자 값의 범위를 제한하려면 다음 단계를 따르세요:
@Param어노테이션을 사용하여 인자 생성기를 선언합니다:kotlin@Param(name = "key", gen = IntGen::class, conf = "1:2") class MultiMapTest { // 테스트들 }name– 인자 생성기의 이름.gen– 생성기의 유형.conf– 생성기를 위한 구성 문자열. 여기서는 Lincheck이 1에서 2 사이의 정수 값을 생성합니다.
Lincheck은 여러 값 유형에 대한 생성기를 제공합니다. 각 유형은 서로 다른 구성 문자열 템플릿을 사용합니다.
자세한 내용은 생성기 유형 섹션을 읽어보세요.
제약 조건을 적용할 연산 매개변수에
@Param어노테이션을 추가합니다:kotlin@Operation fun add(@Param(name = "key") key: Int, value: Int) = map.add(key, value) @Operation fun get(@Param(name = "key") key: Int) = map.get(key)
제약 조건이 적용되면, Lincheck은 지정된 범위 내의 값만 사용하여 시나리오를 생성합니다:
text
| ---------------------------------- |
| Thread 1 | Thread 2 |
| ---------------------------------- |
| add(2, 0): void | add(2, -1): void |
| ---------------------------------- |
| get(2): [-1] | |
| ---------------------------------- |생성기 유형
Lincheck은 다음과 같은 인자 생성기 유형을 제공합니다:
| 생성기 | 구성 템플릿 | 설명 |
|---|---|---|
IntGen | "min:max" | min과 max 사이의 Int 값을 생성합니다(양 끝값 포함). 구성 문자열이 비어 있으면 Int.MIN_VALUE에서 Int.MAX_VALUE까지의 전체 정수 범위를 사용합니다. 예시: "1:3" -> [1, 2, 3] |
StringGen | "maxWordLength:alphabet""maxWordLength""" | 제공된 alphabet에서 최대 maxWordLength 길이까지의 무작위 문자열 값을 생성합니다. 기본 alphabet은 [a-zA-Z\d _]입니다. 기본 maxWordLength는 15입니다. 예시: text |
EnumGen | "Enum.Const1,Enum.Const2,..." | 지정된 열거형(enum) 값 목록에서 무작위 값을 생성합니다. 예시: text |
BooleanGen | "" | true와 false 값을 생성합니다. 별도의 구성 문자열이 필요하지 않습니다. 예시: "" -> [true, false] |
DoubleGen | "start:step:end""start:end""" | start부터 end까지 step만큼 증가하며 Double 값을 생성합니다. 기본 step 값은 (end - start)/100입니다. 구성 문자열이 비어 있으면 Int.MIN_VALUE부터 Int.MAX_VALUE까지 step = 0.1로 값을 생성합니다. 예시: "0.0:0.1:1.0" -> [0.0, 0.1, 0.2, ..., 0.9, 1.0] |
FloatGen | "start:step:end""start:end""" | DoubleGen과 동일하며 값이 Float으로 변환됩니다. 예시: "0.0:0.1:1.0" -> [0.0, 0.1, 0.2, ..., 0.9, 1.0] |
LongGen | "min:max" | IntGen과 동일하며 값이 Long으로 변환됩니다. 예시: "1:3" -> [1, 2, 3] |
ShortGen | "min:max" | min과 max 사이의 Short 값을 생성합니다(양 끝값 포함). 구성 문자열이 비어 있으면 -32768부터 32767까지의 전체 Short 범위를 사용합니다. 예시: "1:3" -> [1, 2, 3] |
ByteGen | "min:max" | min과 max 사이의 Byte 값을 생성합니다(양 끝값 포함). 구성 문자열이 비어 있으면 -128부터 127까지의 전체 바이트 범위를 사용합니다. 예시: "1:3" -> [1, 2, 3] |
ThreadIdGen | "" | 현재 스레드의 ID 번호를 반환합니다. 별도의 구성 문자열이 필요하지 않습니다. 예시: "" -> [1, 2] |
다음 단계
Lincheck에서 특정 연산을 단일 스레드로 제한하는 방법을 알아보세요.
