# gradle 판
  Gradle 9.0.0

# grpc-testkit 이 등록하는 레인 넷과 각각의 태그
  grpc-testkit/build.gradle:15  lane('grpcInProcessContractTest') {
  grpc-testkit/build.gradle:16  tag = 'grpc-inprocess'
  grpc-testkit/build.gradle:20  lane('grpcNettyContractTest') {
  grpc-testkit/build.gradle:21  tag = 'grpc-netty'
  grpc-testkit/build.gradle:25  lane('grpcFaultTest') {
  grpc-testkit/build.gradle:26  tag = 'grpc-fault'
  grpc-testkit/build.gradle:30  lane('grpcPerformanceTest') {
  grpc-testkit/build.gradle:31  tag = 'grpc-performance'

# 기본 test 에 실제로 걸리는 제외 태그는 두 곳에서 온다
  build.gradle:548:    // (the skeleton default) excludeTags is a no-op.
  build.gradle:551:            excludeTags 'quarantine'
  grpc/grpc-testkit/build.gradle:42:        excludeTags 'grpc-performance'
  grpc-testkit/build.gradle:37 // The performance lane is excluded from the default `test` task. It measures a running server
  grpc-testkit/build.gradle:38 // under load, and a measurement in the release gate is a flaky test on a shared CI runner; it runs
  grpc-testkit/build.gradle:39 // when somebody asks for it, by name.
  grpc-testkit/build.gradle:40 tasks.named('test') {
  grpc-testkit/build.gradle:41     useJUnitPlatform {
  grpc-testkit/build.gradle:42         excludeTags 'grpc-performance'
  grpc-testkit/build.gradle:43     }
  grpc-testkit/build.gradle:44 }
  grpc-testkit 안의 quarantine 태그 : 0 건

# 레인 태그는 클래스 단위인가
    testkit/GrpcInProcessContractFixtureTest.java:22:@Tag("grpc-inprocess")
    testkit/GrpcInProcessContractFixtureTest.java-23-class GrpcInProcessContractFixtureTest {
    testkit/GrpcNettyContractProfileTest.java:24:@Tag("grpc-netty")
    testkit/GrpcNettyContractProfileTest.java-25-class GrpcNettyContractProfileTest {
    testkit/GrpcTransportEvidenceClassifierTest.java:37:@Tag("grpc-fault")
    testkit/GrpcTransportEvidenceClassifierTest.java-38-class GrpcTransportEvidenceClassifierTest {
    performance/GrpcPerformanceLaneTest.java:32:@Tag("grpc-performance")
    performance/GrpcPerformanceLaneTest.java-33-class GrpcPerformanceLaneTest {

# check 의 태스크 그래프 — 시험을 돌리지 않고 확인한다
  $ ./gradlew :grpc:grpc-testkit:check --dry-run     GRADLE_EXIT=0
    :grpc:grpc-testkit:compileJava SKIPPED
    :grpc:grpc-testkit:processResources SKIPPED
    :grpc:grpc-testkit:classes SKIPPED
    :grpc:grpc-testkit:checkstyleMain SKIPPED
    :grpc:grpc-testkit:compileTestJava SKIPPED
    :grpc:grpc-testkit:processTestResources SKIPPED
    :grpc:grpc-testkit:testClasses SKIPPED
    :grpc:grpc-testkit:checkstyleTest SKIPPED
    :grpc:grpc-testkit:spotbugsMain SKIPPED
    :grpc:grpc-testkit:spotbugsTest SKIPPED
    :grpc:grpc-testkit:spotlessJava SKIPPED
    :grpc:grpc-testkit:spotlessJavaCheck SKIPPED
    :grpc:grpc-testkit:spotlessCheck SKIPPED
    :grpc:grpc-testkit:test SKIPPED
    :grpc:grpc-testkit:check SKIPPED
    그 그래프 안의 레인 태스크 : 0 건

# 낡은 결과를 지우고 세 레인을 이름으로 돌린다
  실행 전 남아 있는 결과 XML : 0 건
  $ ./gradlew :grpc:grpc-testkit:{grpcInProcessContractTest,grpcNettyContractTest,grpcFaultTest}
    BUILD SUCCESSFUL
    GRADLE_EXIT=0
    [grpcInProcessContractTest]
    GrpcInProcessContractFixtureTest     tests=7 failures=0 errors=0 skipped=0
    시험 7 개
    [grpcNettyContractTest]
    GrpcNettyContractProfileTest         tests=9 failures=0 errors=0 skipped=0
    시험 9 개
    [grpcFaultTest]
    GrpcTransportEvidenceClassifierTest  tests=9 failures=0 errors=0 skipped=0
    시험 9 개

# 같은 leaf 의 기본 test 를 돌린다
  $ ./gradlew :grpc:grpc-testkit:test
    BUILD SUCCESSFUL
    GRADLE_EXIT=0
    GrpcPerformanceGateTest              tests=7 failures=0 errors=0 skipped=0
    GrpcStableReleaseGateTest            tests=9 failures=0 errors=0 skipped=0
    GrpcInProcessContractFixtureTest     tests=7 failures=0 errors=0 skipped=0
    GrpcNettyContractProfileTest         tests=9 failures=0 errors=0 skipped=0
    GrpcServerStreamingContractTest      tests=7 failures=0 errors=0 skipped=0
    GrpcTransportEvidenceClassifierTest  tests=9 failures=0 errors=0 skipped=0
    GrpcUnaryReliabilityContractTest     tests=8 failures=0 errors=0 skipped=0
    시험 56 개

# 레인이 돌린 시험이 기본 test 가 돌린 시험의 부분집합인가
    레인 25 개 · 기본 test 56 개
    레인이 돌린 시험이 기본 test 안에 전부 있는가 : True
    기본 test 에만 있는 시험 : 31 개
    성능 레인 클래스가 기본 test 결과에 있는가 : 0 건

# 레인 태스크만 거는 보증
  ca.strict-test-lane.gradle:4  // useJUnitPlatform { includeTags }, failOnNoDiscoveredTests, outputs.upToDateWhen { false } — once per
  ca.strict-test-lane.gradle:6  // `failOnNoDiscoveredTests` and `upToDateWhen { false }`, and a lane that is added by copy-paste is a
  ca.strict-test-lane.gradle:23  // What a leaf may still not do is opt out of failing closed. There is no `failOnNoDiscoveredTests`
  ca.strict-test-lane.gradle:237  failOnNoDiscoveredTests = true
  ca.strict-test-lane.gradle:239  // And it is not sufficient, which a TestKit fixture established. `failOnNoDiscoveredTests`
  ca.strict-test-lane.gradle:240  // applies to discovery; a tag filter excludes tests *after* discovery, so a lane whose tag
  ca.strict-test-lane.gradle:245  // So the lane counts what it actually executed and refuses zero.
  ca.strict-test-lane.gradle:246  def executedTests = new java.util.concurrent.atomic.AtomicLong(0L)
  ca.strict-test-lane.gradle:247  def executedSelectors =
  ca.strict-test-lane.gradle:250  executedTests.incrementAndGet()
  ca.strict-test-lane.gradle:252  executedSelectors.add(descriptor.className as String)
  ca.strict-test-lane.gradle:253  executedSelectors.add("${descriptor.className}.${descriptor.name}" as String)
  ca.strict-test-lane.gradle:257  if (executedTests.get() == 0L) {
  ca.strict-test-lane.gradle:258  throw new GradleException(
  ca.strict-test-lane.gradle:276  !executedSelectors.any { String executed ->
  ca.strict-test-lane.gradle:285  throw new GradleException(
  ca.strict-test-lane.gradle:293  outputs.upToDateWhen { false }
  ca.strict-test-lane.gradle:299  // failOnNoDiscoveredTests is not enough on its own, which a TestKit fixture established rather
  ca.strict-test-lane.gradle:320  throw new GradleException(
  ca.strict-test-lane.gradle:333  throw new GradleException(
  ca.strict-test-lane.gradle:342  throw new GradleException(
  ca.strict-test-lane.gradle:347  throw new GradleException(

# 레인 태스크를 자동으로 부르는 경로
  grpc-testkit/build.gradle 이 check 를 언급하는가 : 0 건
  워크플로 28 개 중 grpc 를 언급하는 것 : 0 건
  ci-quality-gates.yml:48       - name: Check quality, public paths, and dependency locks
  ci-quality-gates.yml:49         working-directory: src
  ci-quality-gates.yml:50         run: ./gradlew check verifyPublicPathSnapshot verifyDependencyLocks --warning-mode=fail --no-daemon --stacktrace
  ci-quality-gates.yml:51       # Named as its own step because nothing else runs it: `check` does not depend on
  ci-quality-gates.yml:52       # graphqlStableTest, so the lane's required-class guard — the check that its module-boundary
  ci-quality-gates.yml:53       # suite has not silently stopped being discovered — protected nothing in CI. A separate step
  ci-quality-gates.yml:54       # keeps the aggregate invocation below byte-identical, which ConditionalTransportQualification
  ci-quality-gates.yml:55       # ContractTest asserts on, and the two tasks do not overlap.
  ci-quality-gates.yml:56       - name: Qualify the GraphQL Stable lane
  ci-quality-gates.yml:57         working-directory: src
  ci-quality-gates.yml:58         run: ./gradlew :adapter:inbound:graphql:graphqlStableTest --no-daemon --stacktrace
  ci-quality-gates.yml:59       - name: Qualify opt-in inbound transports without skips
  ci-quality-gates.yml:60         working-directory: src
  ci-quality-gates.yml:61         run: ./gradlew conditionalTransportQualification --no-daemon --stacktrace
  그 마지막 스텝이 부르는 태스크가 무엇을 요구하는가 :
    src/build.gradle:594  'test-results/grpcTransportQualificationTest'),
    src/build.gradle:606  dependsOn ':adapter:inbound:grpc:grpcTransportQualificationTest'
