Ruby on Rails 应用测试与功能优化实践
1. 测试用例的编写与优化
在开发过程中,测试是确保代码质量的重要环节。以下是一些测试用例的编写示例:
test "adds a story" do
login_user
assert_difference 'Story.count' do
post stories_path, params: {
⋮ story attributes…
}
⋮ method body…
end
test "rejects when missing story attribute" do
login_user
assert_no_difference 'Story.count' do
post stories_path, params: {
⋮ story attributes…
}
⋮ method body…
end
test "stores user with story" do
login_user
post stories_path, params: {
story: {
name: 'story with user',
link: 'http://www.story-with-user.com/'
}
}
assert_equal users(:glenn), Story.last.user
end
从上述代码可以看出,在每个执行请求的操作前添加了
login_user
方法。
对于
VotesController
的测试,由于投票属于用户,之前的测试可能会失败,因此需要进行优化。在
Minitest
中,可以使用
setup
和
teardown
方法来处理登录和登出操作,示例如下:
class VotesControllerTest < ActionDispatch::IntegrationTest
setup do
login_user
end
teardown do
logout_user
end
test "creates vote" do
assert_difference 'stories(:two).votes.count' do
post story_votes_path(stories(:two))
end
end
test "create vote with ajax" do
post story_votes_path(stories(:two)), xhr: true
assert_response :success
end
test "redirect after vote with http post" do
post story_votes_path(stories(:two))
assert_redirected_to story_path(stories(:two))
end
end
这样,在每个测试执行前会自动登录用户,测试执行后自动登出用户。
2. 运行测试套件
可以使用
rails
命令来运行完整的测试套件:
$ rails test
如果一切顺利,会看到类似以下的结果:
Running via Spring preloader in process 34312
Run options: --seed 60092
# Running:
..............................
Finished in 1.062286s, 28.2410 runs/s, 49.8924 assertions/s.
29 runs, 53 assertions, 0 failures, 0 errors, 0 skips
如果有测试失败,错误信息会帮助定位问题所在。
还可以使用
rails stats
命令查看应用的统计信息,包括应用代码和测试代码的行数比。例如,代码与测试代码的比例为 1:1.6,这意味着编写的测试代码是应用代码的 1.5 倍,表明应用质量较高。
3. 高级功能实现:推广热门故事
为了鼓励读者投票,将故事展示分为两个页面:得分高于一定阈值的故事显示在首页,低于阈值的故事显示在投票页面。
3.1 使用计数器缓存
在处理大量记录时,传统的计数方式可能会影响性能。例如,使用
Story.first.votes.size
会执行两个 SQL 查询。为了解决这个问题,可以使用 Rails 的计数器缓存功能。
启用计数器缓存的步骤如下:
1.
生成迁移文件
:
$ rails generate migration AddCounterCacheToStories votes_count:integer
- 修改迁移文件 :
class AddCounterCacheToStories < ActiveRecord::Migration[5.0]
def change
add_column :stories, :votes_count, :integer, default: 0
Story.find_each do |s|
Story.reset_counters s.id, :votes
end
end
end
- 应用迁移 :
$ rails db:migrate
-
修改关联
:在
app/models/vote.rb中修改belongs_to关联:
belongs_to :story, counter_cache: true
3.2 实现首页
为了实现首页展示得分高于阈值的故事,需要对控制器和视图进行修改。
-
修改控制器
:修改
app/controllers/stories_controller.rb中的index方法:
def index
@stories = Story.where('votes_count >= 5').order('id DESC')
end
-
修改视图
:修改
app/views/stories/index.html.erb模板:
<h2>
<%= "Showing #{ pluralize(@stories.size, 'story') }" %>
</h2>
<%= render partial: 'story', collection: @stories %>
-
创建部分模板
:创建
app/views/stories/_story.html.erb文件:
<div class='story'>
<h3><%= link_to story.name, story %></h3>
<p>
Submitted by: <%= story.user.name %> |
Score: <%= story.votes_count %>
</p>
</div>
4. 总结
通过编写测试用例,可以确保代码的质量和稳定性。使用计数器缓存可以优化应用的性能,特别是在处理大量记录时。实现首页展示热门故事的功能,能够提升用户体验,鼓励用户参与投票。
以下是一个简单的流程图,展示了计数器缓存的使用流程:
graph TD;
A[生成迁移文件] --> B[修改迁移文件];
B --> C[应用迁移];
C --> D[修改关联];
在后续的开发中,可以继续探索更多的测试方式和优化技巧,进一步提升应用的性能和质量。例如,可以研究
Minitest::Spec
或
RSpec
等工具,以创建更复杂的测试场景。同时,还可以对页面进行更多的样式优化,提升用户体验。
Ruby on Rails 应用测试与功能优化实践
5. 首页样式优化
为了让首页展示更加美观,我们可以使用 CSS 对故事列表进行样式优化。由于前面为故事元素添加了
story
类,我们可以基于这个类来编写样式。
以下是一个简单的 CSS 样式示例,假设我们将其写在
app/assets/stylesheets/stories.css
文件中:
.story {
border: 1px solid #ccc;
border-radius: 5px;
padding: 15px;
margin-bottom: 20px;
background-color: #f9f9f9;
}
.story h3 {
margin-top: 0;
}
.story p {
margin-bottom: 0;
color: #666;
}
上述代码为每个故事元素添加了边框、圆角、内边距和背景颜色,同时对标题和段落的样式进行了微调,让页面看起来更加整洁。
6. 性能优化分析
在使用计数器缓存后,我们可以对应用的性能进行进一步分析。以下是一个简单的性能对比表格,展示了使用计数器缓存前后的查询情况:
| 操作 | 未使用计数器缓存 | 使用计数器缓存 |
| ---- | ---- | ---- |
| 查询故事投票数 | 执行两个 SQL 查询:先查询故事,再查询关联的投票数 | 直接从
votes_count
列获取投票数,无需额外查询 |
| 性能影响 | 处理大量记录时,性能显著下降 | 性能提升,尤其是在处理大量记录时 |
从表格中可以看出,计数器缓存对于应用性能的提升是非常明显的。在实际应用中,我们可以使用 Rails 的日志来监控查询情况,进一步验证性能的提升。
7. 后续功能拓展
除了当前实现的功能,我们还可以对应用进行更多的功能拓展。以下是一些拓展方向的列表:
1.
用户个人中心
:添加用户个人中心页面,展示用户提交的故事、投票记录等信息。
2.
故事分类
:为故事添加分类功能,让用户可以根据不同的分类浏览故事。
3.
评论功能
:为故事添加评论功能,让用户可以对故事进行评论和交流。
8. 总结与展望
通过前面的步骤,我们完成了 Ruby on Rails 应用的测试、功能优化和样式设计。编写测试用例确保了代码的质量和稳定性,使用计数器缓存优化了应用的性能,实现首页展示热门故事的功能提升了用户体验。
以下是一个流程图,展示了整个应用开发和优化的主要流程:
graph LR;
A[编写测试用例] --> B[运行测试套件];
B --> C{测试是否通过};
C -- 通过 --> D[实现高级功能:推广热门故事];
C -- 未通过 --> A;
D --> E[优化首页样式];
E --> F[性能优化分析];
F --> G[功能拓展];
在未来的开发中,我们可以继续探索更多的功能和优化技巧,不断提升应用的性能和用户体验。同时,持续编写和维护测试用例,确保代码的质量和稳定性。通过不断的学习和实践,我们可以开发出更加优秀的 Ruby on Rails 应用。
超级会员免费看
27

被折叠的 条评论
为什么被折叠?



