일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 스프링
- 프로그래머스
- 알고리즘 #자료구조 #리스트 #스택 #큐 #트리
- 알고리즘
- 알고리즘 #프로그래머스 #K번째수 #자바 #JAVA #정렬알고리즘 #정렬
- authorizeUrls
- 정적리소스
- Java
- springsecurity
- WebSecurityConfigurerAdapter
- Ruby on Rails
- 정렬
- authorizeUrls missing
- character_set
- 자바
- AuthenticationManagerBuilder
- 파이썬 #기타제어흐름도구 #제어문 #함수 #FOR문
- 루비
- 개발자
- MySQL
- 파이썬 #자료형 #python
- Rails
- configureGlobal
- ruby-prof
- 스프링시큐리티
- authorizeRequests
- python manage.py migrate
- Spring
- minitest
- ruby
- Today
- Total
손만이의 개발노트
Minitest 가이드 본문
문서목적
Minitest의 초기 작성이 익숙하지 않은 사용자들을 위해 작성한 가이드 문서입니다.
테스트
Rails는 공식적으로 minitest를 지향하며 최근 버전에서는 기능테스트는 권장하지 않는다.
(가이드 문서 : https://guides.rubyonrails.org/testing.html)
테스트 이름설명라이브러리
Unit(단위) 테스트 | 애플리케이션을 구성하고 있는 라이브러리 모델 또는 뷰 헬퍼의 동작을 확인한다. | ActiveSupport::TestCase |
Functional(기능) |
컨트롤러와 템플릿의 호출 결과 확인
|
본 문서에서는 관련 라이브러리에 대한 설명은 진행하지 않는다. |
Integration(통합) 테스트 |
여러 개의 컨트롤러를 체크하여 사용자의 실제 조작을 모방하고 결과를 확인 |
ActionDispatch::IntegrationTest |
테스트코드 작성
- 기본 폴더 경로
: 미니테스트의 테스트 코드들은 test/controllers/api/v1의 하위에서 관리한다. - api_test_helper.rb
- 공통적으로 사용되는 helper로 다음과 같은 기능들이 있다.
- setup
- minitest사용시 테스트 시작전에 먼저 실행되는 함수로 주로 설정이나 필요한 변수, 데이터들을 미리 셋팅하는데 이용된다.
- 공통함수에서 사용되는 setup은 user,code 테이블의 데이터, http통신 테스트를 위한 header설정, databasecleaner 설정을 한다.
- databaseclaener의 경우 transaction 설정으로 테스트가 종료되면 테스트한 데이터들은 rollback되며, truncate나 deletion보다 더 빠른 속도를 보여준다.
- teardown
- 테스트가 종료된 후 실행되는 함수로 databaseclaener.clean설정이 공통적으로 들어가 있다.
- 기타
- 데이터나 초기 셋팅에 관련된 함수들.
- setup
- databaseclaener
- databasecleaner는 테스트 하기 위해 test db의 상태를 초기화 해주는 라이브러리다.
- DatabaseCleaner.strategy의 옵션에 따라 사용 방법이 여러가지 인데 transaction,deletion,truncation 방식이 등이 있다.
- deletion,truncation의 경우 db의 테이블을 전부 삭제 후 다시 만들어주는 방식으로 둘다 속도가 느리며 본 문서에서는 transaction의 방식을 이용한다.
- 공식문서 : https://github.com/DatabaseCleaner/database_cleaner/blob/v1.7.0/README.markdown
-
소스 :
transation옵션에 대한 소스
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
require 'database_cleaner/sequel/base'
module DatabaseCleaner
module Sequel
class Transaction
include ::DatabaseCleaner::Sequel::Base
def self.check_fiber_brokenness
if !@checked_fiber_brokenness && Fiber.new { Thread.current }.resume != Thread.current
raise RuntimeError, "This ruby engine's Fibers are not compatible with Sequel's connection pool. " +
"To work around this, please use DatabaseCleaner.cleaning with a block instead of " +
"DatabaseCleaner.start and DatabaseCleaner.clean"
end
@checked_fiber_brokenness = true
end
def start
self.class.check_fiber_brokenness
@fibers ||= []
db = self.db
f = Fiber.new do
db.transaction(:rollback => :always, :savepoint => true) do
Fiber.yield
end
end
f.resume
@fibers << f
end
def clean
f = @fibers.pop
f.resume
end
def cleaning
self.db.transaction(:rollback => :always, :savepoint => true) { yield }
end
end
end
end
- 공통적으로 사용되는 helper로 다음과 같은 기능들이 있다.
-
channel_intro_test.rb
-
소스 :
channel_intro_test.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
require_relative "#{Rails.root}/test/controllers/api/v1/api_test_helper.rb"
class ChannelIntroTest < ActionDispatch::IntegrationTest
include ApplicationHelper
include APITestHelper
def setup
baseSetup
set_channel_test
end
test '퀘스트 가입유저 리스트 조회' do
#skip('@channel 변수가 설정되지 않아 실행을 보류합니다. 해당 담당자분은 처리 부탁드립니다.')
get "/api/v1/channels/#{@channel.id}/users", headers: @headers
assert_response :success
end
end
- 예제로 작성된 테스트 케이스 이다.
- 소스경로 : test/controllers/api/v1/integraion에 정리하는 걸 권장한다.
- 1번라인 : api_test_helper를 사용하기 위해 require하는 부분으로 rails.root를 통해서 절대 위치로 가져온다.
- 3번라인 : 통합테스트에서 권장하는 클래스를 상속한다.
- 4번라인 : 공통적인 함수가 많이 포함된 helper를 include한다.
- 5번라인 : 테스트용으로 작성된 공통적으로 사용할 helper를 include한다.
- 7~10번 라인 : include는 소스를 해당 클래스에 포함하는 개념으로 선언을 안해도 api_test_helper.rb에 있는 setup이 실행되나 추가로 변수나 설정될 함수들이 있으면 setup을 오버라이드 하여 사용한다.
(마찬가지로 teardown 함수도 별도로 선언하지 않으면 api_test_helper에 있는 teardown 함수가 실행된다.) - 12~16번 라인 : get api테스트를 하는 함수로 테스트 함수에 대한 사용법은 가이드 문서를 참고한다.(https://guides.rubyonrails.org/testing.html)
- 실행법 : rails test로 실행하면 현재 프로젝트에 있는 모든 테스트 코드가 실행되나 특정 파일만 실행하고 싶은 경우 뒤에 파일명을 붙여주며, 특정 테스트케이스만 실행하고 싶은경우 파일명 뒤에 테스트케이스을 옵션으로 붙여준다.
ex) rails test test/controllers/api/v1/integration/channel_intro_test.rb
-
- 기타
- factoryGirl
- 테스트 케이스에 사용될 데이터모델을 간단하게 선언 및 사용할 수 있게 해주는 라이브러리다.
-
샘플 :
channels.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
FactoryGirl.define do
factory :channel do
channel_type { 165 }
category_id { 165 }
factory :free_study_group_channel do
group_type { Channel.group_types[:free_study_group] }
end
factory :group_channel do
group_type { Channel.group_types[:group] }
end
end
end
#위와 같이 사용할 수 있으며 폴더 위치는 spec/factories 하위에 작성하고 폴더명은 테이블명과 동일하게 작성한다.(복수)
#사용법 : create함수를 통해 사용할 수 있으며 첫번째인자로 factory에 선언한 심볼명을 준다.
#factory 함수는 위와 같이 중첩이 가능하게 사용할 수 있다.
# ex) @channel = create(:free_study_group_channel, user_id: @owner_user.id)
- factoryGirl
기타
rspec 가이드 추가 예정
'Ruby' 카테고리의 다른 글
Rails실행시 LoadError: dlopen(...) 에러 (0) | 2020.04.06 |
---|---|
404페이지 호출될 시 favicon.ico not found 에러가 나는 경우 (0) | 2020.01.07 |
성능 최적화(ruby-prof) (0) | 2019.12.05 |