아침바라기의 이야기

[Ruby] Fixture 작성 방법 본문

개발이야기/Ruby on Rails

[Ruby] Fixture 작성 방법

아침바라기 2015. 10. 27. 22:23


비슷한 주제인 Mini test를 이용한 모델 테스트 팁은 이전에 한번 다뤘다.


주의점이 한가지 있다. Fixture는 개수가 많아지면 속도가 느려진다.


현재 DB의 데이터를 모두 지웠다가 Fixture 데이터를 넣고 테스트가 완료 되면 롤백한다. 이 과정을 

진행하다보니 기존에 데이터가 많거나 Fixture 수가 늘어나면 늘어날수록 느려진다. 


이걸 해결하려면 test_helper.rb에서 


	class ActiveSupport::TestCase
	  fixtures :all


이 부분을 수정하는 것이 좋다. 


각 테스트 케이스 setup 에서 fixture를 로딩하도록 만들거나 헬퍼를 통해서 필요한 것만 로딩하는 걸 만들어주도록 한다.



Fixture는 YML 형태로 보통 사용한다

아래는 예제다.


	# users.yml
	daniel:
	  name: Daniel
	  job: programmer
	  workplace : google
	son:
	  name: son
	  job: judgement
	  workplace: unknown


테스트에서는 아래와 같이 사용할 수 있다. users.yml이면 .yml 만 뺀 형태 메소드를 레일즈에서 제공한다.


	class UserTest < ActiveSupport::TestCase
	  test "test user" do 
	    assert_equal "Daniel", users(:daniel)
	  end
	end


동적인 데이터도 만들어줄 수 있는데 ERB 형태로 fixture 데이터를 생성할 수 있다. 


	<% 1.upto(100) do |idx| %>
	fix_<%= idx %>:
	  id: <%= idx %>
	  name: person_<%= idx %>
	  created_at: <%= DateTime.now %>
	  option: nil
	<% end %>

100개의 fixture 데이터를 만들었다. (option은 nil값이 들어가고 created_at은 현재 시간이 지정된다.

fixture로 belongs_to, has_one, has_many 관계가 있다고 생각하자. 레일즈는 fixture에 정의한 label을 이용해서 연결해준다.
아래는 예다.

	# class User < ActiveRecord::Base 내부 선언
		belongs_to :job

	# class Job < ActiveRecord::Base 내부 선언 
		has_many :users

	# users.yml
	daniel:
	  name: Daniel
	  job: programmer
	  workplace : google
	kim:
	  name: Kim
	  job: programmer
	  workplace : google
	son:
	  name: son
	  job: judgement
	  workplace: unknown

	# jobs.yml
	programmer:
	  name: Programmer
	judgement:
	  name: Judgement

user 클래스 객체에서 job에 접근을 할 수 있다.

이제 시점을 전환해서 데이터 관점에서 바라보자. 

users 테이블에서 보면 job_id 가 정의되어 있다. job_id는 jobs fixture에 들어간 id나 자동 생성 id가 들어가는걸 볼 수 있다. 
label을 이용하면 자동으로 세팅을 레일즈가 해준다. 임의적으로 조인하는 경우(belongs_to 같은 관계 없이)엔 직접 id 설정을 해야한다.
아래가 그 예제이다.

	# users.yml
	daniel:
	  name: Daniel
	  job_id: 1
	  workplace : google
	kim:
	  name: Kim
	  job_id: 1
	  workplace : google
	son:
	  name: son
	  job_id: 2
	  workplace: unknown

	# jobs.yml
	programmer:
	  id: 1
	  name: Programmer
	judgement:
	  id: 2
	  name: Judgement

ordering 테스트를 만들 때(인덱스 만들기 귀찮아서 id를 쓰는 경우..)도 id를 직접 지정하는 편이 낫다. 


참고
Fixtures API 문서 : 최신 버전 API 문서엔 사용법이 안나와있다(깃헙에 가보면 주석으로 있긴하다)