diff --git a/CHANGELOG b/CHANGELOG
index 1f778c69c96f7de3d32fd11c9c4f906f4ea20ec3..f6d39b28c3bcc866d8e15883a81104a262d6c827 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -26,6 +26,7 @@ v 8.10.0 (unreleased)
   - Add a new column `artifacts_size` to table `ci_builds` !4964
   - Let Workhorse serve format-patch diffs
   - Display tooltip for mentioned users and groups !5261 (winniehell)
+  - Allow build email service to be tested
   - Added day name to contribution calendar tooltips
   - Make images fit to the size of the viewport !4810
   - Fix check for New Branch button on Issue page !4630 (winniehell)
diff --git a/app/controllers/projects/services_controller.rb b/app/controllers/projects/services_controller.rb
index 739681f4085b8e4594c3e2f47183760340dd4cec..1b91882048e3626313b6344abaf272ad66fc3857 100644
--- a/app/controllers/projects/services_controller.rb
+++ b/app/controllers/projects/services_controller.rb
@@ -45,8 +45,9 @@ class Projects::ServicesController < Projects::ApplicationController
   end
 
   def test
-    data = Gitlab::PushDataBuilder.build_sample(project, current_user)
+    data = @service.test_data(project, current_user)
     outcome = @service.test(data)
+
     if outcome[:success]
       message = { notice: 'We sent a request to the provided URL' }
     else
diff --git a/app/mailers/emails/builds.rb b/app/mailers/emails/builds.rb
index 2f86d1be57625ee969cebef8b1e15c70b862ad91..3853af6201ac9509fc963581f2e586ba91efa727 100644
--- a/app/mailers/emails/builds.rb
+++ b/app/mailers/emails/builds.rb
@@ -6,6 +6,7 @@ module Emails
 
       add_project_headers
       add_build_headers('failed')
+
       mail(to: to, subject: subject("Build failed for #{@project.name}", @build.short_sha))
     end
 
diff --git a/app/models/project_services/builds_email_service.rb b/app/models/project_services/builds_email_service.rb
index 54da4d74fc5b21f7f45fcab78d25a1009da9c180..5e166471077ca69cf939591f81f74d9d8fca78b4 100644
--- a/app/models/project_services/builds_email_service.rb
+++ b/app/models/project_services/builds_email_service.rb
@@ -42,6 +42,19 @@ class BuildsEmailService < Service
     end
   end
 
+  def can_test?
+    project.builds.count > 0
+  end
+
+  def disabled_title
+    "Please setup a build on your repository."
+  end
+
+  def test_data(project = nil, user = nil)
+    build = project.builds.last
+    Gitlab::BuildDataBuilder.build(build)
+  end
+
   def fields
     [
       { type: 'textarea', name: 'recipients', placeholder: 'Emails separated by comma' },
@@ -50,6 +63,20 @@ class BuildsEmailService < Service
     ]
   end
 
+  def test(data)
+    begin
+      # bypass build status verification when testing
+      data[:build_status] = "failed"
+      data[:build_allow_failure] = false
+
+      result = execute(data)
+    rescue StandardError => error
+      return { success: false, result: error }
+    end
+
+    { success: true, result: result }
+  end
+
   def should_build_be_notified?(data)
     case data[:build_status]
     when 'success'
diff --git a/app/models/service.rb b/app/models/service.rb
index d7a32c282679221a095f523ee0b6bdb08e2517c3..5432f8c7ab43ebb648fda1ab30a183da61972e84 100644
--- a/app/models/service.rb
+++ b/app/models/service.rb
@@ -76,6 +76,10 @@ class Service < ActiveRecord::Base
     []
   end
 
+  def test_data(project, user)
+    Gitlab::PushDataBuilder.build_sample(project, user)
+  end
+
   def supported_events
     %w(push tag_push issue merge_request wiki_page)
   end
@@ -94,6 +98,11 @@ class Service < ActiveRecord::Base
     !project.empty_repo?
   end
 
+  # reason why service cannot be tested
+  def disabled_title
+    "Please setup a project repository."
+  end
+
   # Provide convenient accessor methods
   # for each serialized property.
   # Also keep track of updated properties in a similar way as ActiveModel::Dirty
diff --git a/app/views/projects/services/_form.html.haml b/app/views/projects/services/_form.html.haml
index 1f13ea28b4e14243597fbe9517e3e2ad2c35c9fb..166dc4a01fc3dadb96714fa1723018ecd6f28b4d 100644
--- a/app/views/projects/services/_form.html.haml
+++ b/app/views/projects/services/_form.html.haml
@@ -12,5 +12,5 @@
       &nbsp;
       - if @service.valid? && @service.activated?
         - disabled = @service.can_test? ? '':'disabled'
-        = link_to 'Test settings', test_namespace_project_service_path(@project.namespace, @project, @service.to_param), class: "btn #{disabled}"
+        = link_to 'Test settings', test_namespace_project_service_path(@project.namespace, @project, @service), class: "btn #{disabled}", title: @service.disabled_title
       = link_to "Cancel", namespace_project_services_path(@project.namespace, @project), class: "btn btn-cancel"
diff --git a/spec/models/project_services/builds_email_service_spec.rb b/spec/models/project_services/builds_email_service_spec.rb
index 236df8f047df335a682329594893cde6110c1311..ca2cd8aa551f7727cb045a1a83ca5da0275fe6a7 100644
--- a/spec/models/project_services/builds_email_service_spec.rb
+++ b/spec/models/project_services/builds_email_service_spec.rb
@@ -23,6 +23,44 @@ describe BuildsEmailService do
     end
   end
 
+  describe '#test_data' do
+    let(:build)   { create(:ci_build) }
+    let(:project) { build.project }
+    let(:user)    { create(:user) }
+
+    before { project.team << [user, :developer] }
+
+    it 'builds test data' do
+      data = subject.test_data(project)
+
+      expect(data[:object_kind]).to eq("build")
+    end
+  end
+
+  describe '#test' do
+    it 'sends email' do
+      data = Gitlab::BuildDataBuilder.build(create(:ci_build))
+      subject.recipients = 'test@gitlab.com'
+
+      expect(BuildEmailWorker).to receive(:perform_async)
+
+      subject.test(data)
+    end
+
+    context 'notify only failed builds is true' do
+      it 'sends email' do
+        data = Gitlab::BuildDataBuilder.build(create(:ci_build))
+        data[:build_status] = "success"
+        subject.recipients = 'test@gitlab.com'
+
+        expect(subject).not_to receive(:notify_only_broken_builds)
+        expect(BuildEmailWorker).to receive(:perform_async)
+
+        subject.test(data)
+      end
+    end
+  end
+
   describe '#execute' do
     it 'sends email' do
       subject.recipients = 'test@gitlab.com'