From 8a0ec1ad62d11c74b357d931154a415176c73f61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moura?= Date: Tue, 31 Mar 2015 20:41:50 -0300 Subject: [PATCH] AMS Benchmark tests #832 Adding a benchmak test structure to help contributors to keep track of how their PR will impact overall performance. It enables developers to create test inside of tests/benchmark. This implementation adds a rake task: ```rake benchmark``` that checkout one commit before, run the test of tests/benchmark, then mover back to the last commit and run it again. By comparing the benchmark results between both commits the contributor will notice if and how much his contribution will impact overall performance. --- .travis.yml | 1 + Gemfile | 3 +- Rakefile | 40 ++++++++++++++++-- test/benchmark/serialization_benchmark.rb | 50 +++++++++++++++++++++++ test/serializers/generators_test.rb | 7 ---- test/test_helper.rb | 2 + 6 files changed, 92 insertions(+), 11 deletions(-) create mode 100644 test/benchmark/serialization_benchmark.rb diff --git a/.travis.yml b/.travis.yml index 6ce693ad6..2f5cae095 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,6 +19,7 @@ env: - "RAILS_VERSION=4.0" - "RAILS_VERSION=4.1" - "RAILS_VERSION=master" + - "JRUBY_OPTS=-Xcext.enabled=true" matrix: allow_failures: diff --git a/Gemfile b/Gemfile index 25b466ebf..e1bc0d650 100644 --- a/Gemfile +++ b/Gemfile @@ -3,7 +3,8 @@ source 'https://rubygems.org' # Specify your gem's dependencies in active_model_serializers.gemspec gemspec -gem "minitest" +gem 'minitest' +gem 'rugged' version = ENV["RAILS_VERSION"] || "4.1" diff --git a/Rakefile b/Rakefile index 8a1f1e9e8..87560f2e2 100644 --- a/Rakefile +++ b/Rakefile @@ -1,7 +1,10 @@ -require "bundler/gem_tasks" - +require 'bundler/gem_tasks' +require 'rugged' +require 'benchmark' require 'rake/testtask' +task :default => :test + Rake::TestTask.new do |t| t.libs << "test" t.test_files = FileList['test/**/*_test.rb'] @@ -9,4 +12,35 @@ Rake::TestTask.new do |t| t.verbose = true end -task :default => :test +Rake::TestTask.new :benchmark_tests do |t| + t.libs << "test" + t.test_files = FileList['test/**/*_benchmark.rb'] + t.ruby_opts = ['-r./test/test_helper.rb'] + t.verbose = true +end + +task :benchmark do + @repo = Rugged::Repository.new('.') + ref = @repo.head + + actual_branch = ref.name + + set_commit('master') + old_bench = Benchmark.realtime { Rake::Task['benchmark_tests'].execute } + + set_commit(actual_branch) + new_bench = Benchmark.realtime { Rake::Task['benchmark_tests'].execute } + + puts 'Results ============================' + puts "------------------------------------~> (Branch) MASTER" + puts old_bench + puts "------------------------------------" + + puts "------------------------------------~> (Actual Branch) #{actual_branch}" + puts new_bench + puts "------------------------------------" +end + +def set_commit(ref) + @repo.checkout ref +end \ No newline at end of file diff --git a/test/benchmark/serialization_benchmark.rb b/test/benchmark/serialization_benchmark.rb new file mode 100644 index 000000000..8fccc44e8 --- /dev/null +++ b/test/benchmark/serialization_benchmark.rb @@ -0,0 +1,50 @@ +require 'test_helper' + +module ActionController + module Serialization + class SerializerTest < ActionController::TestCase + class PostController < ActionController::Base + + def render_with_cache_enable + comment = Comment.new({ id: 1, body: 'ZOMG A COMMENT' }) + author = Author.new(id: 1, name: 'Joao Moura.') + post = Post.new({ id: 1, title: 'New Post', blog:nil, body: 'Body', comments: [comment], author: author }) + + render json: post + end + end + + tests PostController + + def test_render_with_cache_enable + ActionController::Base.cache_store.clear + get :render_with_cache_enable + + expected = { + id: 1, + title: 'New Post', + body: 'Body', + comments: [ + { + id: 1, + body: 'ZOMG A COMMENT' } + ], + blog: { + id: 999, + name: 'Custom blog' + }, + author: { + id: 1, + name: 'Joao Moura.' + } + } + + assert_equal 'application/json', @response.content_type + assert_equal expected.to_json, @response.body + + get :render_with_cache_enable + assert_equal expected.to_json, @response.body + end + end + end +end diff --git a/test/serializers/generators_test.rb b/test/serializers/generators_test.rb index c40d353e1..b6bdb175b 100644 --- a/test/serializers/generators_test.rb +++ b/test/serializers/generators_test.rb @@ -1,10 +1,3 @@ -class Foo < Rails::Application - if Rails.version.to_s.start_with? '4' - config.eager_load = false - config.secret_key_base = 'abc123' - end -end - Rails.application.load_generators require 'generators/serializer/serializer_generator' diff --git a/test/test_helper.rb b/test/test_helper.rb index f3977b610..6ecb6200b 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -13,6 +13,8 @@ class Foo < Rails::Application if Rails.version.to_s.start_with? '4' config.action_controller.perform_caching = true ActionController::Base.cache_store = :memory_store + config.eager_load = false + config.secret_key_base = 'abc123' end end