实现一个简单的Database4(译文)

一给  金牌会员 | 2022-10-5 18:56:19 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 651|帖子 651|积分 1953

前文回顾
实现一个简单的Database1(译文)
实现一个简单的Database2(译文)
实现一个简单的Database3(译文)
译注:cstsck在github维护了一个简单的、类似SQLite的数据库实现,通过这个简单的项目,可以很好的理解数据库是如何运行的。本文是第四篇,主要是使用rspec对目前实现的功能进行测试并解决测试出现BUG
译注:cstsck在github维护了一个简单的、类似sqlite的数据库实现,通过这个简单的项目,可以很好的理解数据库是如何运行的。本文是第四篇,主要是使用rspec对目前实现的功能进行测试并解决测试出现BUG
Part 4 我们的第一个测试(和BUG)

我们已经获得插入数据到数据库并打印所有数据的能力。现在来测试一下目前microseconds已有的功能。

我要使用rspec来写我的测试,因为我对rspec很熟悉,它的语法也相当易读。

译注:rsepec 是一个基于Ruby的测试框架,语法非常简单,可以很方便的测试各种可执行程序,判断输出

我定义一个短小的help来发送一个帮助命令列表到数据库,然后对输出进行断言。
  1. describe 'database' do
  2.   def run_script(commands)
  3.     raw_output = nil
  4.     IO.popen("./db", "r+") do |pipe|
  5.       commands.each do |command|
  6.         pipe.puts command
  7.       end
  8.       pipe.close_write
  9.       # Read entire output
  10.       raw_output = pipe.gets(nil)
  11.     end
  12.     raw_output.split("\n")
  13.   end
  14.   it 'inserts and retrieves a row' do
  15.     result = run_script([
  16.       "insert 1 user1 person1@example.com",
  17.       "select",
  18.       ".exit",
  19.     ])
  20.     expect(result).to match_array([
  21.       "db > Executed.",
  22.       "db > (1, user1, person1@example.com)",
  23.       "Executed.",
  24.       "db > ",
  25.     ])
  26.   end
  27. end
复制代码
这个简单的测试是确认我们的输入能够获取返回结果。并确保能通过测试:
  1. bundle exec rspec
  2. .
  3. Finished in 0.00871 seconds (files took 0.09506 seconds to load)
  4. 1 example, 0 failures
复制代码
现在测试插入更多行数据到数据库是可行的:
  1. it 'prints error message when table is full' do
  2.   script = (1..1401).map do |i|
  3.     "insert #{i} user#{i} person#{i}@example.com"
  4.   end
  5.   script << ".exit"
  6.   result = run_script(script)
  7.   expect(result[-2]).to eq('db > Error: Table full.')
  8. end
复制代码
Enjoy GreatSQL
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

一给

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表