So, now that we've seen what autopilot can do, let's dig in to making this work for our testing efforts. A fair warning, there is some python code ahead, but I would encourage even the non-programmers among you to have a glance at what is below. It's not exotic programming (after all, I did it!). Before we start, let's make sure you have autopilot itself installed. Note, you'll need to get the version from this ppa in order for things to work properly:
sudo add-apt-repository ppa:autopilot/ppa
sudo apt-get update && sudo apt-get install python-autopilot
Ok, so first things first. Let's create a basic shell that we can use for any testcase that we want to write. To make things a bit easier, there's a lovely bazaar branch you can pull from that has everything you need to follow along.
bzr branch lp:~nskaggs/+junk/autopilot-walkthrough
cd autopilot-walkthrough
You'll find two folders. Let's start with the helloworld folder. We're going to verify autopilot can see the testcases, and then run and look at the 'helloworld' tests first. (Note, in order for autopilot to see the testcases, you need to be in the root directory, not inside the helloworld directory)
$ autopilot list helloworld
Loading tests from: /home/nskaggs/projects/
helloworld.test_example.ExampleFunctions.test_keyboard
helloworld.test_example.ExampleFunctions.test_mouse
helloworld.test_hello.HelloWorld.test_type_hello_world
3 total tests.
Go ahead and execute the first helloworld test.
autopilot run helloworld.test_hello.HelloWorld.test_type_hello_world
A gedit window will spawn, and type hello world to you ;-) Go ahead and close the window afterwards. So, let's take a look at this basic testcase and talk about how it works.
from autopilot.testcase import AutopilotTestCase
class HelloWorld(AutopilotTestCase):
def setUp(self):
super(HelloWorld, self).setUp()
self.app = self.start_app("Text Editor")
def test_type_hello_world(self):
self.keyboard.type("Hello World")
If you've used other testing frameworks that follow in the line of xUnit, you will notice the similarities. We implement an AutopilotTestCase object (class HelloWorld(AutopilotTestCase)), and define a new method for each test (ie, test_type_hello_world). You will also notice the setUp method. This is called before each test is run by the testrunner. In this case, we're launching the "Text Editor" application before we run each test (self.start_app("Text Editor")). Finally our test (test_type_hello_world) is simply sending keystrokes to type out "Hello World".
From this basic shell we can add more testcases to the helloworld testsuite easily by adding a new method. Let's add some simple ones now to show off some other capabilities of autopilot to control the mouse and keyboard. If you branched the bzr branch, there is a few more tests in the test_example.py file. These demonstrate some of the utility methods AutopilotTestCase makes available to us. Try running them now. The comments inside the file also explain briefly what each method does.
autopilot run helloworld.test_example.ExampleFunctions.test_keyboard
autopilot run helloworld.test_example.ExampleFunctions.test_mouse
Now there is more that autopilot can do, but armed with this basic knowledge we can put the final piece of the puzzle together. Let's create some assertions, or things that must be true in order for the test to pass. Here's a testcase showing some basic assertions.
autopilot run helloworld.test_example.ExampleFunctions.test_assert
Finally, there's some standards that are important to know when using autopilot. You'll notice a few things about each testsuite.
- We have a folder named testsuite.
- Inside the folder, we have a file named test_testsuite.py
- Inside the file, we have TestSuite class, with test_testcase_name
- Finally, in order for autopilot to see our testsuite we need to let python know there is a submodule in the directory. Ignoring the geekspeak, we need an __init__.py file (this can be blank if not otherwise needed)
wow, pretty impressive stuff, thanks for providing this snippets =)
ReplyDeleteI get the following when trying to list the tests in helloworld or run them:
ReplyDeletehavryliuk@havryliuk:~/autopilot-walkthrough$ autopilot run helloworld.test_hello.HelloWorld.test_type_hello_world
Traceback (most recent call last):
File "/usr/bin/autopilot", line 258, in
main()
File "/usr/bin/autopilot", line 238, in main
run_tests(args)
File "/usr/bin/autopilot", line 160, in run_tests
test_suite = load_test_suite_from_name(args.suite)
File "/usr/bin/autopilot", line 205, in load_test_suite_from_name
package = __import__(top_level_pkg)
ImportError: No module named helloworld
Folder helloworld is there and I am executing these commands from the autopilot-walkthrough folder
try running autopilot list helloworld. What happens? Does it show the tests? Something like this?
Deletehelloworld.test_example.ExampleFunctions.test_assert
helloworld.test_example.ExampleFunctions.test_keyboard
helloworld.test_example.ExampleFunctions.test_mouse
helloworld.test_hello.HelloWorld.test_type_hello_world
4 total tests.