무민은귀여워

[Ruby on rails] 테스트 본문

IT/기타

[Ruby on rails] 테스트

moomini 2018. 10. 22. 00:41
반응형

테스트

※ 퍼펙트 루비온 레일즈 ( Ruby On Rails 5アプリケーションプログラミング)8장 요약

애플리케이션의 규모가 커지면, 테스트를 위해 많은 비용(인력과 시간)이 필요하다.
그래서 최근 애플리케이션 개발에서는 테스트를 위한 스크립트를 만들어서 테스트를 자동화하는 것이 일반적.

rails가 지원하는 테스트의 종류
  • Unit 테스트
  • Functional 테스트
  • Integration 테스트

테스트 데이터베이스의 구축 및 준비

1
rails db:migrate RAILS_ENV=test
cs

1
rails db:drop RAILS_ENV=test DISABLE_DATABASE_ENVIRONMENT_CHECK=1
cs

Unit 테스트

Unit 테스트(단위 테스트)는 애플리케이션을 구성하고 있는 라이브러리(주요 모델 등)가 제대로 작동하는지 확인하는 테스트이다.

-----------------------
test 메서드
-----------------------
test name do
assertion
end
-----------------------
name : 테스트 이름
assertion : 테스트 코드
-----------------------

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
require 'test_helper'
 
class BookTest < ActiveSupport::TestCase
 
  test "book save" do
    book = Book.new({
      isbn: '978-4-7741-4466-X',
      title: 'Ruby on Rails本格入門',
      price: 3100,
      publish: '技術評論社',
      published: '2017-02-14',
      dl: false
    })
    assert book.save, 'Failed to save'
  end
cs

assert  메서드는 첫 번째 매개 변수 (save 메서드의 리턴 값)가 true일 경우 테스트가 성공했다는 것을 의미. 
두 번째 매개 변수는 테스트가 실패했을 때 출력할 글자.

모델 유효성 결과 확인

모델에서 정의한 유효성 검사의 동작을 확인하는 것도 가능

1
2
3
4
5
6
7
8
9
10
11
12
13
14
test "book validate" do
    book = Book.new({
      isbn: '978-4-7741-44',
      title: 'Ruby on Rails本格入門',
      price: 3100,
      publish: '技術評論社',
      published: '2017-02-14',
      dl: false
    })
 
    assert !book.save, 'Failed to validate'
    assert_equal book.errors.size, 2'Failed to validate count'
    assert book.errors[:isbn].any?, 'Failed to isbn validate'
  end
cs

book validate 세 종류의 Assertion을 실행한다.

  • 유효성 검사를 통과하지 못해, 저장에 실패했을 경우
  • 두 개의 유효성 검사가 있을 경우
  • isbn 필드의 유효성 검사 오류가 적어도 한 개 이상 있을 경우

모델을 통해 검색한 결과를 확인

1
2
3
4
5
6
7
test "where method test" do
    result = Book.find_by(title: '改訂新版JavaScript本格入門')
    assert_instance_of Book, result ,'result is not instance of Book'
    assert_equal books(:modernjs).isbn, result.isbn, 'isbn column is wrong.'
    assert_equal Date.new(2016930), result.published,
      'published column is wrong.'
  end
cs
  • 추출한 결과가 Book 객체인지 확인
  • isbn 필드가 픽스처 books.yml 에 있는 :modrnjs 키의 isbn 필드와 같은지 확인
  • publish 필드가 2016/09/30 인지 확인

뷰 헬퍼 테스트

1
2
3
4
5
6
7
require 'test_helper'
class ViewHelperTest < ActionView::TestCase
  test "format helper" do
    result = format_datetime(Time.now, :date)
    assert_match /\d{4}年\d{1,2}月\d{1,2}日/, result
  end
end
cs

format helper 테스트는 format_datetime 메서드의 리턴 값이 9999년 99월 99일의 형식인지 정규 표현식으로 확인한다.

Functional 테스트

컨트롤러(액션)의 동작 또는 템플릿의 출력을 확인하기 위한 테스트

-----------------------
get 메서드
-----------------------
get(action [,params [session [,flash]]])
-----------------------
action : 실행할 액션
params : 실행 시에 함께 전달할 매개 변수
session : 실행 시에 이용할 세션 정보
flash : 실행 시에 사용할 플래시 정보
-----------------------

1
2
3
4
5
6
7
8
9
10
require 'test_helper'
 
class HelloControllerTest < ActionDispatch::IntegrationTest
 
  test "list action" do
    get '/hello/list'
    assert_equal 10, assigns(:books).length, 'found rows is wrong.'
    assert_response :success, 'list action failed.'
    assert_template 'hello/list'
  end
cs

라우팅 동작 확인 - assert_generates 메서드

1
2
3
4
test "routing check" do
    assert_generates('hello/list', { controller: 'hello', action: 'list' })
    # assert_recognizes({ controller: 'hello', action: 'list' }, 'hello/list')
  end
cs

템플릿 출력 결과 확인 - assert_select

1
2
3
4
5
6
7
8
9
10
11
12
13
14
test "select check" do
    get '/hello/list'
    assert_select 'title'
    assert_select 'title'true
    assert_select 'font'false
    assert_select 'title''Railbook'
    assert_select 'script[data-turbolinks-track=?]''reload'
    assert_select 'title'/[A-Za-z0-9]+/
    assert_select 'table tr[style]'10
    assert_select 'table' do
      assert_select 'tr[style]'1..10
    end
    assert_select 'title', { count: 1, text: 'Railbook' }
  end
cs


Integration 테스트

통합 테스트라고도 부른다. 여러 개의 컨트롤러를 넘나들며 실제 사용자의 행동을 모방할 때 사용한다.
예 ) 로그인 기능
  1. hello#view 액션에 접근
  2. 미인증 상태이므로, login#index 액션(로그인 페이지)로 리다이렉트
  3. 로그인 페이지에서 사용자 이름과 비밀번호를 입력하고 인증 처리
  4. login#auth 액션에서 인증 처리가 완료되면 hello#view 액션으로 리다이렉트

테스트 스크립트 생성

1
rails generate integration_test admin_login
cs

테스트 스크립트 작성

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
require 'test_helper'
 
class AdminLoginTest < ActionDispatch::IntegrationTest
  test "login test" do
    get '/hello/view'
    assert_response :redirect
    assert_redirected_to controller: :login, action: :index
    assert_equal '/hello/view', flash[:referer]
 
    follow_redirect!
    assert_response :success
    assert_equal '/hello/view', flash[:referer]
 
 
    post '/login/auth'
    params: { username: 'yyamada', password: '12345',
      referer: '/hello/view' }
    assert_response :redirect
    assert_redirected_to controller: :hello, action: :view
    assert_equal users(:yyamada).id, session[:usr]
 
    follow_redirect!
    assert_response :success   
  end
 
end
cs

테스트 실행

1
rails test test/integration/admin_login_test.rb
cs


반응형
Comments