I want to make a list and explain some of the preconceived ideas about exploratory testing that come mostly from people who heard little or not at all about the term. I used the discussion from a context-driven testing forum, especially James Bach comments.
I want to make a little intro for scripting that might be useful in testing. Some testers are very scared of it and don’t use scripting at all. Some are scared when see the jobs ads and become obsessed in learning all the tools required.
I will practice on an application used by Markus Gärtner to perform testing but with a different approach. This is Parking Calculator. It is basically calculating the cost of a parking ticket based on the entrance and exit time-stamp.
After you play with it (like 15 min or even less) you can see how it works: gets some input, and when pressing “Calculate” you get a result expressed as an integer (basic case). But what is very important is the URL generated. For example this case:
The url generated is:
You can see “12:51″ is there in the url as “EntryTime=12%3A51″ for example. “7/14/2010″ is there as “EntryDate=7%2F14%2F2010″. You can change the url itself and see the application appears to fill the data itself. Instead “52″ use “48″. Also important the result of park ticket cost is generated by only loading the link. This means we can use the link directly and read the source code of the webpage to check the result.
With python code we can do this with 3 lines:
import urllib2 f = urllib2.urlopen('http://adam.goucher.ca/parkcalc/index.php?Lot=STP&EntryTime=12%3A00&EntryTimeAMPM=AM&EntryDate=7%2F14%2F2010&ExitTime=12%3A00&ExitTimeAMPM=AM&ExitDate=7%2F22%2F2010&action=calculate&Submit=Calculate') print f.read()
The first 1000 chars will look like this:
So till this point we have a python script that for a predefined date(fixed not parametrized) is outputting the source code for the page containing the relevant result.
In the webpage source we see result “210″. We can search to find where is located within:
This is a lucky situation because: the result is displayed only once and it has before it a char recognizable for parsing the result “$”. Not to parse the result to get it from the huge page you can do a regular expression extraction or chop out the text. Using regular expression can be more complex.
I will chop it. First start from the dollar sign to the rest of the initial string:
import urllib2 f = urllib2.urlopen('http://adam.goucher.ca/parkcalc/index.php?Lot=STP&EntryTime=12%3A00&EntryTimeAMPM=AM&EntryDate=7%2F14%2F2010&ExitTime=12%3A00&ExitTimeAMPM=AM&ExitDate=7%2F22%2F2010&action=calculate&Submit=Calculate') text1=f.read() text2="$" print text1[text1.find(text2):]
Now we have to truncate the right part starting from firs occurrence of char “<”
import urllib2 f = urllib2.urlopen('http://adam.goucher.ca/parkcalc/index.php?Lot=STP&EntryTime=12%3A00&EntryTimeAMPM=AM&EntryDate=7%2F14%2F2010&ExitTime=12%3A00&ExitTimeAMPM=AM&ExitDate=7%2F22%2F2010&action=calculate&Submit=Calculate') text1=f.read() text2="$" text3 = text1[text1.find(text2):] text4 = "<" text5 = text3[:text3.find(text4)] print text5
If you save this into a file test.py and run “python test.py” you should have “$ 210.00 “.
This is not the way of doing python programming but should help a lot the beginners! We also use the code as secondary need, its not included in some product!
Now let’s parametrize the input so we can use any input data.
We have this parameters:
We also need to reduce the string used because is very long and hard to work with.
import urllib2 def CalculatePrice(P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13): urlPage="http://adam.goucher.ca/parkcalc/index.php?" urlLot= "Lot=%s&" % (P1) urlEntryTime="EntryTime="+P2+"%3A"+P3+"&" urlEntryAMPM="EntryTimeAMPM=%s&" % (P4) urlEntryDate="EntryDate="+P6+"%2F"+P5+"%2F"+P7+"&" urlExitTime="ExitTime="+P8+"%3A"+P9+"&" urlExitAMPM="ExitTimeAMPM=%s&" % (P10) urlExitDate="ExitDate="+P12+"%2F"+P11+"%2F"+P13+"&" urlEnd="action=calculate&Submit=Calculate" urlstring=urlPage+urlLot+urlEntryTime+urlEntryAMPM+urlEntryDate+urlExitTime+urlExitAMPM+urlExitDate+urlEnd f = urllib2.urlopen(urlstring) text1=f.read() text2="$" text3 = text1[text1.find(text2):] text4 = "<" text5 = text3[:text3.find(text4)] return text5 result=CalculatePrice("STP","12","51","AM","14","7","2010","12","52","AM","22","7","2010") if result=="$ 210.00": print "Test Pass" else: print "Test Fail"
You can see here too many parameters. You can leave like this or group by date and time. You can have 3 parameters by doing that.
You can use the unittest framework, the usual framework for building automated tests in python.
You can parse better the html using BeautifulSoup
You can do better coding.
You can generate a range and expected result for running.
So here it depends on the person doing that. If you do as a task only in work you will care very little for the value of testing and focus on coding. If you want valuable result s from that you will not care too much for coding, unless you have in mind integrating and sharing.
The most problematic issue with automation is that increases thinking but in a direction that doesn’t help too much the testing value, doesn’t protect the application from bugs getting to customers. It only seems more valuable when the other testers not only don’t know scripting but don’t study testing at all.
I saw that is somehow popular to create sometimes a 101 list, so I though I would create one myself.
The list is about the terms encountered, most of them in testing folklore,job ads, some relevant some not, but in general words related to testing.
3. Test Case
4. Test Plan
6. Automated Test
8. Programming experience
10. White Box
11. Black Box
12. Grey Box
16. GUI testing
17. Unit Testing
18. Integration Testing
19. System Testing
20. Regression Testing
21. Acceptance Testing
22. Alpha Testing
23. Beta Testing
24. Performance Testing
25. Load Testing
26. Stability Testing
27. Usability Testing
28. Security Testing
29. PEN (Penetration) Testing
30. Internationalization and Localisation
31. Destructive Testing
32. Smoke Testing
33. Ad-hoc Testing
35. Test Cycle
38. Exploratory Testing
43. Testing Team
44. Test Team Lead
45. QA Lead
46. Testing methods
47. Associate tester
48. Junior Tester
49. Senior Tester
53. Bug Report
54. Bug Tracker
58. Test Run
63. Test Specialist
72. Step-by-step description
72. Expected result
73. Actual Result
74. Test Suite
75. Test Summary
76. Test Scenario
77. Test Procedure
78. SUT (System under test)
79. Test harness
80. executed tests
81. Test execution engine
82. Test script repository
83. Manual Testing
85. Session based testing
87. Test environment
88. User acceptance testing
90. Test estimation
91. Test configuration
92. Test results
96. Windows and Linux environments
97. Test Analist
98. Test Phase
99. Test Design
101. Test Experience
Well I might have duplicated or forget some important ones but this are pretty common terms used when referring to testing. It might not be in the same context but they are there and maybe it shouldn’t be.
I don’t see too many articles or blogging on the other part of a testing project: the client.
We have to bare in mind and be prepared to give the client some things that tends to be everywhere.
I wanted initially to make a simple video on some Skype issues. What I realized is that I don’t do good videos, I don’t speak clear enough, I don’t keep people connected. But I don’t want to spend too much time in creating a video to look good and over thinking. I want to just try to point my idea for now as best I can, post it, see my obvious mistakes and try to improve the parts that don’t work so well in the future. Keep the flow. Step-by-step.
I really need to improve a lot, but till I get better, I can provide usefulness with some other skills that I am already above the average, like creating a nice puzzle http://www.testalways.com/2010/07/05/find-bugs-and-patterns/ .
In testing everyone tends to go on their already defined area of expertise. Either if its team leading and task assignment, programming, good communication skills, logic and problem solving, business model approaches, its always good as long as it doesn’t go too much on just bulshit. But we need to learn and get familiar with the other parts that we need in testing, try to be completely covered.
So this is what I am trying now.