前文回顾
实现一个简单的Database1(译文)
实现一个简单的Database2(译文)
实现一个简单的Database3(译文)
译注:cstsck在github维护了一个简单的、类似SQLite的数据库实现,通过这个简单的项目,可以很好的理解数据库是如何运行的。本文是第四篇,主要是使用rspec对目前实现的功能进行测试并解决测试出现BUG
译注:cstsck在github维护了一个简单的、类似sqlite的数据库实现,通过这个简单的项目,可以很好的理解数据库是如何运行的。本文是第四篇,主要是使用rspec对目前实现的功能进行测试并解决测试出现BUG
Part 4 我们的第一个测试(和BUG)
我们已经获得插入数据到数据库并打印所有数据的能力。现在来测试一下目前microseconds已有的功能。
我要使用rspec来写我的测试,因为我对rspec很熟悉,它的语法也相当易读。
译注:rsepec 是一个基于Ruby的测试框架,语法非常简单,可以很方便的测试各种可执行程序,判断输出
我定义一个短小的help来发送一个帮助命令列表到数据库,然后对输出进行断言。- describe 'database' do
- def run_script(commands)
- raw_output = nil
- IO.popen("./db", "r+") do |pipe|
- commands.each do |command|
- pipe.puts command
- end
- pipe.close_write
- # Read entire output
- raw_output = pipe.gets(nil)
- end
- raw_output.split("\n")
- end
- it 'inserts and retrieves a row' do
- result = run_script([
- "insert 1 user1 person1@example.com",
- "select",
- ".exit",
- ])
- expect(result).to match_array([
- "db > Executed.",
- "db > (1, user1, person1@example.com)",
- "Executed.",
- "db > ",
- ])
- end
- end
复制代码 这个简单的测试是确认我们的输入能够获取返回结果。并确保能通过测试:- bundle exec rspec
- .
- Finished in 0.00871 seconds (files took 0.09506 seconds to load)
- 1 example, 0 failures
复制代码 现在测试插入更多行数据到数据库是可行的:- it 'prints error message when table is full' do
- script = (1..1401).map do |i|
- "insert #{i} user#{i} person#{i}@example.com"
- end
- script << ".exit"
- result = run_script(script)
- expect(result[-2]).to eq('db > Error: Table full.')
- end
复制代码 Enjoy GreatSQL
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |