InfoGrab DocsInfoGrab Docs

실험 테스트

요약

실험 작업 과정에서 내장된 RSpec 도구를 사용할 수 있습니다. stub_experiments를 사용해 실험을 스텁할 수 있으며, 이는 :experiment 타입 없이도 사용 가능합니다. 매처를 사용하여 등록된 동작, 제외 조건, 세그멘테이션 등도 테스트할 수 있습니다.

RSpec으로 실험 테스트하기#

실험 작업 과정에서 내장된 RSpec 도구를 사용할 수 있습니다. spec/experiments 내의 파일에 대해서는 자동으로 적용되지만, 다른 파일 및 스펙에서도 포함하려면 :experiment 타입을 명시할 수 있습니다:

it "tests experiments nicely", :experiment do
end

Stub 헬퍼#

stub_experiments를 사용해 실험을 스텁할 수 있으며, 이는 :experiment 타입 없이도 사용 가능합니다. 실험 이름을 키로, 각 실험이 해석될 variant를 값으로 하는 해시를 전달합니다:

# Ensures the experiments named `:example` & `:example2` are both "enabled" and
# that each will resolve to the given variant (`:my_variant` and `:control`).
stub_experiments(example: :my_variant, example2: :control)

experiment(:example) do |e|
  e.enabled? # => true
  e.assigned.name # => 'my_variant'
end

experiment(:example2) do |e|
  e.enabled? # => true
  e.assigned.name # => 'control'
end

제외, 세그멘테이션 및 동작 매처#

매처를 사용하여 등록된 동작, 제외 조건, 세그멘테이션 등도 테스트할 수 있습니다.

class ExampleExperiment < ApplicationExperiment
  control { }
  candidate { '_candidate_' }

  exclude { context.actor.first_name == 'Richard' }
  segment(variant: :candidate) { context.actor.username == 'jejacks0n' }
end

excluded = double(username: 'rdiggitty', first_name: 'Richard')
segmented = double(username: 'jejacks0n', first_name: 'Jeremy')

# register_behavior matcher
expect(experiment(:example)).to register_behavior(:control)
expect(experiment(:example)).to register_behavior(:candidate).with('_candidate_')

# exclude matcher
expect(experiment(:example)).to exclude(actor: excluded)
expect(experiment(:example)).not_to exclude(actor: segmented)

# segment matcher
expect(experiment(:example)).to segment(actor: segmented).into(:candidate)
expect(experiment(:example)).not_to segment(actor: excluded)

트래킹 매처#

이벤트 트래킹은 실험의 핵심 측면입니다. 트래킹 호출이 제대로 커버되도록 유연한 방법을 제공하고자 합니다.

인스턴스 레벨 또는 "모든 인스턴스" 레벨에서 수행할 수 있습니다:

subject = experiment(:example)

expect(subject).to track(:my_event)

subject.track(:my_event)

on_next_instance 체인 메서드를 사용하면 다음 실험 인스턴스에서 발생하도록 지정할 수 있습니다. 이는 다운스트림에서 experiment(:example).track을 호출하는 경우에 유용합니다:

expect(experiment(:example)).to track(:my_event).on_next_instance

experiment(:example).track(:my_event)

track 매처에 체인할 수 있는 메서드의 전체 예시:

expect(experiment(:example)).to track(:my_event, value: 1, property: '_property_')
  .on_next_instance
  .with_context(foo: :bar)
  .for(:variant_name)

experiment(:example, :variant_name, foo: :bar).track(:my_event, value: 1, property: '_property_')

Jest로 테스트하기#

Stub 헬퍼#

spec/frontend/__helpers__/experimentation_helper.js에 정의된 stubExperiments 헬퍼를 사용해 실험을 스텁할 수 있습니다.

import { stubExperiments } from 'helpers/experimentation_helper';
import { getExperimentData } from '~/experimentation/utils';

describe('when my_experiment is enabled', () => {
  beforeEach(() => {
    stubExperiments({ my_experiment: 'candidate' });
  });

  it('sets the correct data', () => {
    expect(getExperimentData('my_experiment')).toEqual({ experiment: 'my_experiment', variant: 'candidate' });
  });
});

Jest 스펙에서 이 스텁 방식은 테스트 종료 시 자동으로 스텁을 해제하지 않습니다. 스텁된 실험은 window.gl의 다른 모든 전역 데이터와 병합됩니다. 테스트 후 스텁된 실험을 제거하거나 테스트 전에 깨끗한 전역 객체를 확보해야 한다면, 전역 객체를 직접 관리해야 합니다:

describe('tests that care about global state', () => {
  const originalObjects = [];

  beforeEach(() => {
    // For backwards compatibility for now, we're using both window.gon & window.gl
    originalObjects.push(window.gon, window.gl);
  });

  afterEach(() => {
    [window.gon, window.gl] = originalObjects;
  });

  it('stubs experiment in fresh global state', () => {
    stubExperiment({ my_experiment: 'candidate' });
    // ...
  });
})

실험 테스트

GitLab v19.1
원문 보기
요약

실험 작업 과정에서 내장된 RSpec 도구를 사용할 수 있습니다. stub_experiments를 사용해 실험을 스텁할 수 있으며, 이는 :experiment 타입 없이도 사용 가능합니다. 매처를 사용하여 등록된 동작, 제외 조건, 세그멘테이션 등도 테스트할 수 있습니다.

RSpec으로 실험 테스트하기#

실험 작업 과정에서 내장된 RSpec 도구를 사용할 수 있습니다. spec/experiments 내의 파일에 대해서는 자동으로 적용되지만, 다른 파일 및 스펙에서도 포함하려면 :experiment 타입을 명시할 수 있습니다:

it "tests experiments nicely", :experiment do
end

Stub 헬퍼#

stub_experiments를 사용해 실험을 스텁할 수 있으며, 이는 :experiment 타입 없이도 사용 가능합니다. 실험 이름을 키로, 각 실험이 해석될 variant를 값으로 하는 해시를 전달합니다:

# Ensures the experiments named `:example` & `:example2` are both "enabled" and
# that each will resolve to the given variant (`:my_variant` and `:control`).
stub_experiments(example: :my_variant, example2: :control)

experiment(:example) do |e|
  e.enabled? # => true
  e.assigned.name # => 'my_variant'
end

experiment(:example2) do |e|
  e.enabled? # => true
  e.assigned.name # => 'control'
end

제외, 세그멘테이션 및 동작 매처#

매처를 사용하여 등록된 동작, 제외 조건, 세그멘테이션 등도 테스트할 수 있습니다.

class ExampleExperiment < ApplicationExperiment
  control { }
  candidate { '_candidate_' }

  exclude { context.actor.first_name == 'Richard' }
  segment(variant: :candidate) { context.actor.username == 'jejacks0n' }
end

excluded = double(username: 'rdiggitty', first_name: 'Richard')
segmented = double(username: 'jejacks0n', first_name: 'Jeremy')

# register_behavior matcher
expect(experiment(:example)).to register_behavior(:control)
expect(experiment(:example)).to register_behavior(:candidate).with('_candidate_')

# exclude matcher
expect(experiment(:example)).to exclude(actor: excluded)
expect(experiment(:example)).not_to exclude(actor: segmented)

# segment matcher
expect(experiment(:example)).to segment(actor: segmented).into(:candidate)
expect(experiment(:example)).not_to segment(actor: excluded)

트래킹 매처#

이벤트 트래킹은 실험의 핵심 측면입니다. 트래킹 호출이 제대로 커버되도록 유연한 방법을 제공하고자 합니다.

인스턴스 레벨 또는 "모든 인스턴스" 레벨에서 수행할 수 있습니다:

subject = experiment(:example)

expect(subject).to track(:my_event)

subject.track(:my_event)

on_next_instance 체인 메서드를 사용하면 다음 실험 인스턴스에서 발생하도록 지정할 수 있습니다. 이는 다운스트림에서 experiment(:example).track을 호출하는 경우에 유용합니다:

expect(experiment(:example)).to track(:my_event).on_next_instance

experiment(:example).track(:my_event)

track 매처에 체인할 수 있는 메서드의 전체 예시:

expect(experiment(:example)).to track(:my_event, value: 1, property: '_property_')
  .on_next_instance
  .with_context(foo: :bar)
  .for(:variant_name)

experiment(:example, :variant_name, foo: :bar).track(:my_event, value: 1, property: '_property_')

Jest로 테스트하기#

Stub 헬퍼#

spec/frontend/__helpers__/experimentation_helper.js에 정의된 stubExperiments 헬퍼를 사용해 실험을 스텁할 수 있습니다.

import { stubExperiments } from 'helpers/experimentation_helper';
import { getExperimentData } from '~/experimentation/utils';

describe('when my_experiment is enabled', () => {
  beforeEach(() => {
    stubExperiments({ my_experiment: 'candidate' });
  });

  it('sets the correct data', () => {
    expect(getExperimentData('my_experiment')).toEqual({ experiment: 'my_experiment', variant: 'candidate' });
  });
});

Jest 스펙에서 이 스텁 방식은 테스트 종료 시 자동으로 스텁을 해제하지 않습니다. 스텁된 실험은 window.gl의 다른 모든 전역 데이터와 병합됩니다. 테스트 후 스텁된 실험을 제거하거나 테스트 전에 깨끗한 전역 객체를 확보해야 한다면, 전역 객체를 직접 관리해야 합니다:

describe('tests that care about global state', () => {
  const originalObjects = [];

  beforeEach(() => {
    // For backwards compatibility for now, we're using both window.gon & window.gl
    originalObjects.push(window.gon, window.gl);
  });

  afterEach(() => {
    [window.gon, window.gl] = originalObjects;
  });

  it('stubs experiment in fresh global state', () => {
    stubExperiment({ my_experiment: 'candidate' });
    // ...
  });
})