Dead Simple Tests in ruby
The biggest barrier for me to start up coding in Ruby now is that I want to have tests with me. Getting Rspec setup outside of rails is a whole article which I never remember each time. (There’s nothing wrong with other test frameworks, I just love my Rspec.)
Setting up Rspec on a new project time has taken me 30 min sometimes. I never feel productive doing it, even though I know the result.I can setup a skeleton project on github and clone it each time, but how much ‘boilerplate’ do I want in my code??
I want something so simple, that even when I’m hacking through some algorithms, I can just start having tests, and I think I have found a way to do Dead Simple Tests in Ruby. (No, this will not be another gem.)
The way I do Dead Simple Tests in Ruby is:
puts method_under_test(value_to_test_for) == intended_result
That’s it! I have to do it in the same file, but for anything less than a rails project, this will suffice. :-D No need to import a file or gem. No need to make sure the tests associate with the right method in a different file. I just use it on the spot.
Honestly, I’m surprised I didn’t do this sooner. It would have saved a lot of frustration in setting up Rspec, or getting lost in documentation online, or getting lost looking for that article or github repo.
How I use these tests on a short project, like say writing a new division method:
First line in division.rb file:
puts divide(nil, nil) == nil
Run the file with command:
divide.rb:1:in `<main>': undefined method `divide' for main:Object (NoMethodError)
An error will be there since there’s no method named
let’s fix that. Now the file should look like:
def divide(num, den) end puts divide(nil, nil) == nil
ruby division.rb again and the output will be:
Yes, there’s the first test, dead simple, right?
Now, let’s add on with a test that will require a result:
def divide(num, den) end puts divide(nil, nil) == nil puts divide(1, 1) == 1
ruby division.rb produces output:
Boom. The first test passed, now the second one is failing, so let’s fix it:
def divide(num, den) num/den end puts divide(nil, nil) == nil puts divide(1, 1) == 1
ruby divide.rb again and get output:
Now just keep repeating with more tests, code for those tests, refactor, and repeat.
I love using this when testing sorting algorithms, my tests become so easy to write:
puts sort(Array(1..10)) == Array(1..10)
puts sort(Array(1..10).reverse!) == Array(1..10)
This makes generating the tests so easy and simple to verify.
After a handful of tests, it gets tricky to keep track of all the
true, so I usually comment out old ones and keep the current one I
am working on. To run them all again, I just uncomment the tests.
I learned to make super simple tests in Ruby so that I can basically
start any small project with it just by using
==. When I
can get started on a project fast, I expect to get my tests
fast… that means I can go fast, stay clean, have fun programming.
This method is so simple, it allows me to go fast with tests. It also keeps my file clean and simple. I can also start coding, get this: without the Internet! I just need Ruby running and I’m good to go!
Stay testing, my friend. ;-)