<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2468094238199231967</id><updated>2011-12-28T13:36:50.045+02:00</updated><category term='java'/><category term='admin'/><category term='news'/><category term='swing'/><category term='bugs'/><category term='functional'/><category term='monkey testing'/><category term='tutorial'/><category term='automated testing'/><category term='random testing'/><category term='jython'/><category term='demo'/><category term='conferences'/><category term='ATDD'/><category term='robotframework'/><title type='text'>Here be Robots!</title><subtitle type='html'>Thoughts about Robot Framework development as well as Agile testing, test automation and Python programming in general.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://hereberobots.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2468094238199231967/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://hereberobots.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Pekka Klärck</name><uri>http://www.blogger.com/profile/00901693165404242900</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='19' height='32' src='http://1.bp.blogspot.com/_mYL44Ff79Vc/Sf9n2_ZkcGI/AAAAAAAAAAM/rm3PE53PcDk/s1600-R/peke.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>19</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2468094238199231967.post-4021721020561813890</id><published>2011-12-28T13:36:00.001+02:00</published><updated>2011-12-28T13:36:50.055+02:00</updated><title type='text'>Robot Framework Newsletter, December 2011</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;br /&gt;&lt;h1&gt;Introduction&lt;/h1&gt;&lt;blockquote&gt;&lt;/blockquote&gt;Welcome to the second installment of the Robot Framework newsletter. I hope you have survived Christmas, and are looking toward a successful year 2012!&lt;br /&gt;&lt;br /&gt;&lt;h1&gt;The news&lt;/h1&gt;&lt;br /&gt;&lt;h2&gt;Robot Framework 2.7 in development&lt;/h2&gt;&lt;br /&gt;The development of Robot Framework 2.7 has proceeded reasonably well and the new &lt;i&gt;rebot&lt;/i&gt; implementation is considered done, In the end, we managed to reduce both memory consumption and execution speed of &lt;i&gt;rebot&lt;/i&gt; around 50% compared to all previous releases. At the same time, log and report generation when using &lt;i&gt;pybot&lt;/i&gt; has also gotten more efficient.&lt;br /&gt;&lt;br /&gt;There are still &lt;a href="http://code.google.com/p/robotframework/issues/list?can=2&amp;amp;q=target=2.7&amp;amp;sort=priority"&gt;a number of open issues&lt;/a&gt; targeted for 2.7, but some of those are not going to make it to the final release. Our goal is to fix the remaining defects and release some sort of alpha after that.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;RIDE 0.40 in development&lt;/h2&gt;&lt;br /&gt;We've also started development of RIDE 0.40, which will contain two major improvements:&lt;br /&gt;&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;A plain text editor mode&lt;/li&gt;&lt;li&gt;Support for aligning columns in test case and keyword tables.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;The plain text editor will be enabled by default, and it will allow editing of a whole test case or resource file at a time. The changes are synced between the plain text and structured editor.&lt;br /&gt;&lt;br /&gt;If a test case (or a keyword table) contains other than default headers, that table is interpreted as data driven, and the columns will be aligned according to headers when written in plain text format. It is possible to edit the table headers using the plain text editor mentioned above.&lt;br /&gt;&lt;br /&gt;In addition, Robot Framework 2.7 fixes some parsing related bugs and inconsistencies that have been blocking some RIDE issues and these will be resolved in RIDE 0.40.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;SeleniumLibrary 2.8.1 released.&lt;/h2&gt;&lt;br /&gt;We recently released 2.8.1 version of &lt;a href="http://code.google.com/p/robotframework-seleniumlibrary/"&gt;SeleniumLibrary&lt;/a&gt;. It upgrades the bundled Selenium server to version 2.15 (with support for Firefox 8)&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;ATDD demo with Robot Framework available.&lt;/h2&gt;&lt;br /&gt;Pekka Klärck and I presented a session called "Acceptance Test Driven Development Using Robot Framework" at EuroStar conference earlier this year. The demo application is available as a &lt;a href="http://code.google.com/p/atdd-with-robot-framework/"&gt;Google Code project&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h1&gt;Upcoming events&lt;/h1&gt;&lt;br /&gt;Here's a list of upcoming events that are going to feature Robot Framework in one way or another.&lt;br /&gt;&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;span class="happen"&gt;&lt;a href="http://skillsmatter.com/course/agile-testing/pekka-klarcks-robot-framework-hands-on-training"&gt;Robot Framework Hands-On training&lt;/a&gt; at Skills Matter, London&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2468094238199231967-4021721020561813890?l=hereberobots.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hereberobots.blogspot.com/feeds/4021721020561813890/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2468094238199231967&amp;postID=4021721020561813890' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2468094238199231967/posts/default/4021721020561813890'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2468094238199231967/posts/default/4021721020561813890'/><link rel='alternate' type='text/html' href='http://hereberobots.blogspot.com/2011/12/introduction-welcome-to-second.html' title='Robot Framework Newsletter, December 2011'/><author><name>Janne</name><uri>http://www.blogger.com/profile/08405229122553595687</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2468094238199231967.post-570258417975563471</id><published>2011-11-04T14:07:00.004+02:00</published><updated>2011-12-28T09:18:03.343+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><category scheme='http://www.blogger.com/atom/ns#' term='robotframework'/><title type='text'>Robot Framework Newsletter, November 2011</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;br /&gt;&lt;h1&gt;What's this?&lt;/h1&gt;&lt;br /&gt;I have been thinking recently that the Robot Framework development must seem quite opaque to anyone outside the core team. We occasionally communicate when a development effort of some project is started, but at other times releases just come out of the woods.&lt;br /&gt;&lt;br /&gt;To alleviate the lack of communication, I thought that a monthly newsletter would be in order. My intention is shed light on things that have been done in the recent past as well as highlight the things that we are likely to engage in the near future. I also figured that a slightly longer "feature article" would be nice in each newsletter.&lt;br /&gt;&lt;br /&gt;And now you are enjoying the very first issue of the said newsletter.  Hopefully it won't be the last. I would be grateful for any feedback, as well as suggestions for feature article topics.&lt;br /&gt;&lt;br /&gt;&lt;h1&gt;The news&lt;/h1&gt;&lt;br /&gt;Some of these are actually already "olds", but in my opinion important enough to list here anyway.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Robot Framework 2.7 in development&lt;/h3&gt;&lt;br /&gt;We recently started the development of Robot Framework 2.7. The &lt;a href="http://code.google.com/p/robotframework/issues/list?can=2&amp;amp;q=target=2.7&amp;amp;sort=priority"&gt;list of issues&lt;/a&gt; initially targeted for 2.7 is quite long, and subject to heavy pruning, probably during next week.&lt;br /&gt;&lt;br /&gt;The core team has been working on &lt;a href="http://code.google.com/p/robotframework/issues/detail?id=865"&gt;faster and less resource consuming rebot&lt;/a&gt;, and we've been making good progress. Whole rebot was basically written from scratch and it is now integrated, and all tests are passing in the current HEAD.&lt;br /&gt;&lt;br /&gt;If you have any contributions towards 2.7, now is the time to act.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Projects moved to GitHub&lt;/h3&gt;&lt;br /&gt;We've created a GitHub organization for &lt;a href="https://github.com/robotframework"&gt;Robot Framework&lt;/a&gt;, and have already moved some projects there. The reasoning for this move warrants its own post, but the short story is that we hope to&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;ease our own work&lt;/li&gt;&lt;li&gt;lower the barrier for contributing&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;br /&gt;We are likely to continue moving projects to GitHub, although the migration of core framework itself has not yet been scheduled.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;New test libraries&lt;/h3&gt;Ryan Tomac has released &lt;a href="https://github.com/rtomac/robotframework-selenium2library"&gt;Selenium2Library&lt;/a&gt;, which is a drop-in replacement for SeleniumLibrary, but it uses the new Selenium2 WebDriver API instead of the Remote control API used by the old library. Thanks Ryan for this major contribution!&lt;br /&gt;&lt;br /&gt;The core team has released first version of &lt;a href="https://github.com/robotframework/Rammbock"&gt;Rammbock&lt;/a&gt;, which is a generic network protocol test library for Robot Framework. Rammbock is still in its early stages, but shows great promise.&lt;br /&gt;&lt;br /&gt;&lt;h1&gt;Feature of the month: How Robot Framework development is organized&lt;/h1&gt;&lt;br /&gt;As mentioned in &lt;a href="http://robotframework.org/"&gt;project pages&lt;/a&gt;, Robot Framework was started as an internal project at Nokia Networks (which was later merged with Siemens network business to create NSN), and was open sourced later. It is widely used at NSN, and NSN still funds RF development.&lt;br /&gt;&lt;br /&gt;The core team (currently numbering one part-time NSN person and 4,5 externals) is paid by NSN and works at NSN premises in Espoo, Finland. Pekka Klärck, creator of the framework, is part of the core team.&lt;br /&gt;&lt;br /&gt;In addition to developing the core framework and RIDE, and maintaining several test libraries, the core team is responsible for NSN-wide training and support of Robot Framework.&lt;br /&gt;&lt;br /&gt;Priorities for RF development arise mainly from the internal users, and these needs affect the order in which, for example RF and RIDE releases are made. However, we tend to fix bugs regardless of who opened the bug report.  Similarly, generic, useful enhancements of reasonable scope are also often made without direct internal need.&lt;br /&gt;&lt;br /&gt;All the core team projects have issue trackers, and even though sometimes neglected for a while, the issue tracker is the most accurate source of information about the scope of any upcoming release.&lt;br /&gt;&lt;br /&gt;We do not have any kind of roadmaps, or deadlines for releases. We try to work on only one project at any given time, and after a release is made, next project is chosen based on the priorities at that point. This also means that most of the time, most of the projects are on hold.&lt;br /&gt;&lt;br /&gt;All the above applies obviously only to projects that are directly maintained by the core team. There's a growing number of test libraries and other tools maintained by active community members, and those projects have their own governing rules.&lt;br /&gt;&lt;br /&gt;If this raises further questions, use comments, or start a thread in &lt;a href="http://groups.google.com/group/robotframework-users/"&gt;mailing list&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h1&gt;Upcoming events&lt;/h1&gt;&lt;br /&gt;Here's a list of upcoming events that are going to feature Robot Framework in one way or another.&lt;br /&gt;&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;2011-11-07 &lt;a href="http://testausosy.ttlry.fi/finnstar-suomalaiset-eurostar-ja-cast-esitykset-2011-11-07-klo-151840"&gt;FinnStar&lt;/a&gt;, presentations from CAST and EuroSTAR by Finns, (sold out)&lt;/li&gt;&lt;li&gt;2011-11-24 EuroStar in Manchester, &lt;a href="http://www.eurostarconferences.com/conferences/session-details.aspx?sessionId=312"&gt;&lt;span class="happen"&gt;Acceptance Test Driven Development Using Robot Framework&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="happen"&gt;&lt;a href="http://skillsmatter.com/course/agile-testing/pekka-klarcks-robot-framework-hands-on-training"&gt;Robot Framework Hands-On training&lt;/a&gt; at Skills Matter, London&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2468094238199231967-570258417975563471?l=hereberobots.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hereberobots.blogspot.com/feeds/570258417975563471/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2468094238199231967&amp;postID=570258417975563471' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2468094238199231967/posts/default/570258417975563471'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2468094238199231967/posts/default/570258417975563471'/><link rel='alternate' type='text/html' href='http://hereberobots.blogspot.com/2011/11/robot-framework-newsletter-november.html' title='Robot Framework Newsletter, November 2011'/><author><name>Janne</name><uri>http://www.blogger.com/profile/08405229122553595687</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2468094238199231967.post-2486108169108017140</id><published>2011-08-20T20:01:00.014+03:00</published><updated>2011-08-20T21:37:44.528+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='automated testing'/><category scheme='http://www.blogger.com/atom/ns#' term='bugs'/><category scheme='http://www.blogger.com/atom/ns#' term='monkey testing'/><category scheme='http://www.blogger.com/atom/ns#' term='random testing'/><title type='text'>Monkey Testing: a Technique for Detecting Nasty Bugs</title><content type='html'>&lt;p&gt;&lt;br /&gt;I'm going to tell about a technique that could help you find those bugs that no one else can find or are classified as "non-reproducible".&lt;br /&gt;&lt;/p&gt;&lt;h2&gt;Some real life bugs&lt;/h2&gt;First let me show you that the technique also works with a real and recent 0.37 version of &lt;a href="http://code.google.com/p/robotframework-ride/"&gt;RIDE&lt;/a&gt; by demonstrating some hard to detect bugs that I detected with the tool I made. NOTE: These bugs have been in RIDE for very long time so they should be repeatable also in older versions.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;First bug&lt;/h3&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Open RIDE&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Open a keyword or a suite editor&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Insert some text to the first row&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Select the first row and select move row up from row context menu -- Nothing happens&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Undo the last command (Ctrl+Z) -- produces a stack trace either to RIDE log or to command prompt&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;h3&gt;Second bug&lt;/h3&gt;This is a bit trickier but it has &lt;a href="http://code.google.com/p/robotframework-ride/issues/detail?id=737"&gt;an issue&lt;/a&gt; in RIDE issue tracker -- unlike the previous one. Most likely because the underlying problem could have more ways to reveal it self than just this one.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Open RIDE&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Open a keyword editor&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Insert some text to the fifth line&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Delete first row&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Delete sixth row&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Save file&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Delete third row -- produces a stack trace either to RIDE log or to command prompt&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;h2&gt;Monkey testing&lt;/h2&gt;So how did I detect those bugs and how did I find a way to reproduce them?&lt;br /&gt;&lt;br /&gt;I used a technique called monkey testing. It's name comes from the saying: "a thousand monkeys at a thousand typewriters will eventually type out the entire works of Shakespeare".&lt;br /&gt;&lt;p&gt;The basic idea is to make an automated system that randomly executes actions in the system under test. If the actions are selected in a way that will keep the system under test in a running state the test can just go on forever (or until it finds a bug).&lt;br /&gt;&lt;/p&gt;&lt;p&gt;To make the detected bugs reproducible the randomness in the test system must be controlled. Basic method is to control and log the seed value of the used (pseudo) random number generator.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Usually a failing test run will result in a very long trace (a list of executed actions) that needs to be pruned to find out the actions that resulted in the detected error. This pruning can of course be automatic.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;You can find the related code from &lt;a href="http://code.google.com/p/robotframework-ride/source/browse/#hg%2Frtest"&gt;http://code.google.com/p/robotframework-ride/source/browse/#hg%2Frtest&lt;/a&gt;.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;h2&gt;How do I know (well almost) that there is no more of these bugs around?&lt;/h2&gt;Because I have now let those monkeys run for several hours without catching anything. This gives me confidence to say that it is very unlikely that there are bugs that the monkey testing tool could produce and detect. In RIDE I mean that there most likely are no more non-GUI code bugs that will throw exceptions while editing test cases or keywords. And I can still put the monkeys to work to make me even more confident that the bugs that I have detected so far are all there is (I have corrected the bugs so the monkeys will not stumble on them again).&lt;br /&gt;&lt;p&gt;It is very important that a monkey testing tool can produce enough different kinds of actions to make it possible for it to express different types of defecting traces. The tool should also have good enough detection mechanisms so it will catch the defects -- but remember that more complexity means more complexity (the error could be in the tool if the tool is too complex).&lt;br /&gt;&lt;/p&gt;&lt;p&gt;In my case with the RIDE the detection mechanism has so far been only to catch exceptions but I've been thinking of taking some basic action related assertions in to use.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;If you find this technique useful you could also check out model based testing to make monkeys that handle more complex action sequences and situations.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2468094238199231967-2486108169108017140?l=hereberobots.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hereberobots.blogspot.com/feeds/2486108169108017140/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2468094238199231967&amp;postID=2486108169108017140' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2468094238199231967/posts/default/2486108169108017140'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2468094238199231967/posts/default/2486108169108017140'/><link rel='alternate' type='text/html' href='http://hereberobots.blogspot.com/2011/08/monkey-testing-technique-for-detecting.html' title='Monkey Testing: a Technique for Detecting Nasty Bugs'/><author><name>Mikko Korpela</name><uri>http://www.blogger.com/profile/15817076154969501663</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2468094238199231967.post-7248842380685983096</id><published>2011-08-01T20:47:00.004+03:00</published><updated>2011-08-04T14:48:02.485+03:00</updated><title type='text'>Super Sized JavaScript</title><content type='html'>The most technically challenging improvements in &lt;a href="http://www.robotframework.org/"&gt;Robot Framework 2.6&lt;/a&gt; are the new logs. They are about 1/10 of the size of the old logs and they are completely generated from very large JSON objects. One of the challenges in the new format is that the log is a single file that includes all the generated JavaScript, HTML and CSS code.&lt;br /&gt;&lt;br /&gt;The largest new style log-files so far have been about 100 MB (that is a lot of JavaScript) and I believe that because we are working with such a big JavaScript objects we've encountered many difficulties that others have not yet have to deal with.&lt;br /&gt;&lt;br /&gt;Although these files take time to download when loaded from servers, once loaded they work very well. Actually after we had first figured out how to make these almost 100 MB log-files work the reality came in and we had to figure out a way to split those large files to reasonable sized pieces (the method that we used is also explained in this post)..&lt;br /&gt;&lt;br /&gt;Here's a list of tricks that we have learned during the process of super sized JavaScript development.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Doing large computations in JavaScript and how to prevent browser from freezing.&lt;/h3&gt;&lt;span style="font-style:italic;"&gt;One of the first problems we had was that the extra large html/JavaScript files would freeze almost all browsers while expanding all the log elements in logs tree view. The final solution to this problem required some thinking and experimentation as the second point (not putting everything to the event queue) wasn't obvious.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;JavaScript engines are one threaded and event based. This means that a big task will freeze everything. You can split your big task with setTimeout function to smaller parts. But if you split your task in too many parts and queue them all to the task queue the browser will again freeze as there is no space for users tasks.&lt;br /&gt;&lt;br /&gt;The solution is to have a separate queue for the tasks that are generated during execution and to have only one task in the real event queue in any given time.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;function timerTasker() {&lt;br /&gt;    var currentTask = tasksQueue.nextTask();&lt;br /&gt;    currentTask.do();&lt;br /&gt;    tasksQueue.appendAll(currentTask.tasks()); //add tasks generated during current task execution&lt;br /&gt;    if (!tasksQueue.isEmpty()) {&lt;br /&gt;       setTimeout(timerTasker, 0);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Lazy domain objects.&lt;/h3&gt;Everything should be as lazy as possible when dealing with a huge serialized data. It would be very sad to run out of memory or CPU when generating thousands of useless objects that no one will ever use.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;IE9 JavaScript parsing out of memory.&lt;/h3&gt;&lt;span style="font-style:italic;"&gt;Everything seemed to work ok even with very large files (Over 20 MB) but then we tried them in the IE9 and some of the logs just didn't work. After hard debugging we found that IE9 had a very odd problem that none of the other browsers had.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;For some reason IE9 JavaScript parsing with reasonable small sized lists containing nested lists and integers and strings  (the total size in our case was "only" 1.5 MB) will run in to out of memory error. This can be prevented by not mixing integers and strings.. In my opinion this could be a bug in IE9 as IE8 doesn't have these problems.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Too Large JavaScript.&lt;/h3&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;After IE9 problem was fixed everything was again OK. Until we finally tried to generate extremely big JavaScript log files. This time the problems were with Firefox. Luckily these were simple problems with easy fixes -- just had to invent a clever way to split our data.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Firefox 4 (and 5) will at some point between 40MB - 80MB start to say that your JavaScript block is too large.. To prevent this use multiple JavaScript blocks instead of just one. The memory errors seem to occur during parsing, thus you can handle extremely large objects but you just have to keep the parser happy.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;    window.data = [.. [big data subelement] ..];&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;br /&gt;-- transform this to: --&lt;br /&gt;&lt;br /&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;    window.dataSubElement = [big data subelement];&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;    window.data = [.. window.dataSubElement ..];&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;h3&gt;Loading more JavaScript on the fly + Chrome safety.&lt;/h3&gt;&lt;span style="font-style:italic;"&gt;100 MB log files were not something that all of our users wanted to work with. So we had to find a way to split the logs. The method had to work also locally. After brainstorming with ideas and spiking with techniqus we finally found a solution that works.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;There are many ways to load more JavaScript while a page is open. I think that AJAX request to a server is the most common way but in our case there is no server.&lt;br /&gt;&lt;br /&gt;There is a convenient function in jQuery for downloading new scripts ($.getScript) but it doesn't work for local files when using Chrome (@see &lt;a href="http://code.google.com/p/chromium/issues/detail?id=40787"&gt;Chrome issue 40787&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Our solution was to insert new script blocks to dom-tree on the fly (&lt;a href="http://www.hunlock.com/blogs/Howto_Dynamically_Insert_Javascript_And_CSS#quickIDX1"&gt;How to Dynamically Insert JavaScript&lt;/a&gt;). This works at least in our case.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Robot Framework 2.6 with new logs and reports has been finally released and everything seems to run smoothly (knock on wood). It was very interesting experience (with a lot of unexpected problems) to develop them. Respect to all my teammates!&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2468094238199231967-7248842380685983096?l=hereberobots.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hereberobots.blogspot.com/feeds/7248842380685983096/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2468094238199231967&amp;postID=7248842380685983096' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2468094238199231967/posts/default/7248842380685983096'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2468094238199231967/posts/default/7248842380685983096'/><link rel='alternate' type='text/html' href='http://hereberobots.blogspot.com/2011/06/super-sized-javascript.html' title='Super Sized JavaScript'/><author><name>Mikko Korpela</name><uri>http://www.blogger.com/profile/15817076154969501663</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2468094238199231967.post-5523139293569332100</id><published>2011-03-28T13:18:00.000+03:00</published><updated>2011-03-28T13:18:04.258+03:00</updated><title type='text'>Robot Framework at XP2011 Conference</title><content type='html'>Robot Framework has strong presence at &lt;a href="http://xp2011.org/"&gt;XP2011&lt;/a&gt; conference that is organized in Madrid 10th-13th May, 2011. Janne Härkönen and I, Pekka Klärck, will be present and we organize the following two sessions.&lt;br /&gt;&lt;br /&gt;&lt;dl&gt;  &lt;dt&gt;Demo: Acceptance Testing with Robot Framework&lt;/dt&gt;  &lt;di&gt;This is a short introduction targeted mainly for people without earlier experience about the tool. The session is organized on Wednesday 11th May and more information can be found from the &lt;a href="http://xp2011.org/program?sid=221&amp;o=2"&gt;conference pages&lt;/a&gt;.  &lt;dt&gt;&amp;nbsp;&lt;/dt&gt;&lt;di&gt;&lt;/di&gt;  &lt;dt&gt;Tutorial: Acceptance Test Driven Development (ATDD) with Robot Framework&lt;/dt&gt;  &lt;di&gt;In this four hour tutorial we concentrate on the ATDD process, but participants also learn how to create ATDD tests with Robot Framework. The tutorial is organized on Friday 13th May and the contents are explained in more detail on the &lt;a href="http://xp2011.org/program?sid=402&amp;o=1"&gt;conference pages&lt;/a&gt;.&lt;/dl&gt;&lt;br /&gt;We are also highly interested to discuss any Robot related topics with the users of the framework and anyone who is interested. If you are coming and want to chat let us know beforehand or just find as wondering around the conference area. If there's more interest, perhaps we can organize an ad-hoc Robot session around a jar of sangria.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2468094238199231967-5523139293569332100?l=hereberobots.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hereberobots.blogspot.com/feeds/5523139293569332100/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2468094238199231967&amp;postID=5523139293569332100' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2468094238199231967/posts/default/5523139293569332100'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2468094238199231967/posts/default/5523139293569332100'/><link rel='alternate' type='text/html' href='http://hereberobots.blogspot.com/2011/03/robot-framework-at-xp2011-conference.html' title='Robot Framework at XP2011 Conference'/><author><name>Pekka Klärck</name><uri>http://www.blogger.com/profile/00901693165404242900</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='19' height='32' src='http://1.bp.blogspot.com/_mYL44Ff79Vc/Sf9n2_ZkcGI/AAAAAAAAAAM/rm3PE53PcDk/s1600-R/peke.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2468094238199231967.post-4844728787085584776</id><published>2011-03-28T10:47:00.000+03:00</published><updated>2011-03-28T10:47:47.954+03:00</updated><title type='text'>Using Jython REPL to explore with SwingLibrary</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Today, I was faced with creating an extension keyword to &lt;a href="http://code.google.com/p/robotframework-swinglibrary/"&gt;SwingLibrary&lt;/a&gt;, and I wanted (of course) to also make a Robot test case testing that new keyword. With non-trivial applications, Swing tests always require quite a bit of setup, many keywords have to be used before the interesting component is available.&lt;br /&gt;&lt;br /&gt;Using Robot Framework to get the setup "right" is quite slow, since the turnaround time (= time to execute the test) is quite long, at least some tens of seconds. There is a somewhat faster method of using the SwingLibrary directly from an interactive Jython session. So I fired up Jython with the dependencies in the CLASSPATH:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:bash"&gt;CLASSPATH=bin:lib/swinglibrary-1.1.3-jar-with-dependencies.jar jython&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;And did some exploration:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:python"&gt;import SwingLibrary&lt;br /&gt;lib = SwingLibrary()&lt;br /&gt;lib.runKeyword('startApplication', ['com.acme.MyFancyApp'])&lt;br /&gt;lib.runKeyword('selectWindow', ['myMainWindow']) &lt;br /&gt;lib.runKeyword('listComponentsInContext', [])&lt;br /&gt;...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;There are a couple things worth noting here:&lt;br /&gt;&lt;ol style="text-align: left;"&gt;&lt;li&gt;It is easiest to use the SwingLibrary keywords using the &lt;code&gt;runKeyword&lt;/code&gt;-method, since the actual keywords are not methods of the SwingLibrary class.&lt;/li&gt;&lt;li&gt;&amp;nbsp;When using &lt;code&gt;runKeyword&lt;/code&gt;, the arguments are always given in a list and the list has to supplied, even when it is empty. &lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;When the desired workflow is achieved the keywords can be written down in a test case.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2468094238199231967-4844728787085584776?l=hereberobots.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hereberobots.blogspot.com/feeds/4844728787085584776/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2468094238199231967&amp;postID=4844728787085584776' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2468094238199231967/posts/default/4844728787085584776'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2468094238199231967/posts/default/4844728787085584776'/><link rel='alternate' type='text/html' href='http://hereberobots.blogspot.com/2011/03/using-jython-repl-to-explore-with.html' title='Using Jython REPL to explore with SwingLibrary'/><author><name>Janne</name><uri>http://www.blogger.com/profile/08405229122553595687</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2468094238199231967.post-8326987886608904369</id><published>2011-02-17T10:14:00.032+02:00</published><updated>2011-02-17T16:08:53.333+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='swing'/><category scheme='http://www.blogger.com/atom/ns#' term='demo'/><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><title type='text'>Swingin' it</title><content type='html'>Here's a really simple demo, or tutorial if you will, about using the Robotframework SwingLibrary.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Download the latest &lt;a href="http://robotframework-swinglibrary.googlecode.com/files/swinglibrary-demo.zip"&gt;demo&lt;/a&gt; and extract it to the desired directory. Oh, and you should have the &lt;a href="http://code.google.com/p/robotframework/wiki/Installation"&gt;Robotframework&lt;/a&gt; and &lt;a href="http://code.google.com/p/robotframework/wiki/Installation#Jython_installation"&gt;Jython&lt;/a&gt; installed. Open your command line and navigate to the extracted demo directory. Try to run the finnished demo to verify that everything is installed and working ok. Execute:&lt;/div&gt;&lt;br /&gt;&lt;code&gt;run_demo.py example&lt;/code&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;The SwingLibrary jar needs to be included in the classpath in order to be found by the Robotframework. The run_demo.py does this for you and executes the test suite provided as an argument.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Examine the SUT i.e. Todo List Application. Start the application by running the following in the command line at the demo root:&lt;/div&gt;&lt;code&gt;&lt;br /&gt;java -cp lib/swinglibrary-1.1.2-SNAPSHOT-jar-with-dependencies.jar \ org.robotframework.swing.testapp.examplesut.TodoListApplication&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;As you can see, this a really basic todo list Swing application written in Java. Have a look around and close the application when your done.&lt;br /&gt;&lt;br /&gt;Open your favourite text editor. Create a new test suite file (e.g. test.txt) and save it to the demo root. Take the SwingLibrary into use in the test suite, type:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;*** Settings ***&lt;br /&gt;Library  SwingLibrary&lt;br /&gt;&lt;br /&gt;*** Test Cases ***&lt;br /&gt;Test Add Todo Item&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;(Note! In this plain text format the cell separator is 2 spaces)&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Run the test.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;run_demo.py example.txt&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;The test should execute and fail with an error message: "The test case contains no keywords". Ok let's add some and start the application and select it's main window.&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;*** settings ***&lt;br /&gt;Library  SwingLibrary&lt;br /&gt;&lt;br /&gt;*** Test Cases ***&lt;br /&gt;Test Add Todo Item&lt;br /&gt;    Start Test Application&lt;br /&gt;&lt;br /&gt;*** User Keywords ***&lt;br /&gt;Start Test Application&lt;br /&gt;    Start Application  org.robotframework.swing.testapp.examplesut.TodoListApplication&lt;br /&gt;    Select Main Window&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Run the test again and now the application should start and test still fails.&lt;br /&gt;&lt;br /&gt;Ok, progress. Let's move the start-up stuff into Suite Setup. Then insert text "Buy some milk" into the text field, that the developer has named logically "description". While at it, let's push the "Add Todo Item"-button with a logical name "add".&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;*** settings ***&lt;br /&gt;Library  SwingLibrary&lt;br /&gt;Suite Setup  Start Test Application&lt;br /&gt;&lt;br /&gt;*** Test Cases ***&lt;br /&gt;Test Add Todo Item&lt;br /&gt;    Insert Todo Item Buy some milk&lt;br /&gt;&lt;br /&gt;*** User Keywords ***&lt;br /&gt;Start Test Application&lt;br /&gt;    Start Application  org.robotframework.swing.testapp.examplesut.TodoListApplication&lt;br /&gt;    Select Main Window&lt;br /&gt;&lt;br /&gt;Insert Todo Item ${arg}&lt;br /&gt;    Insert Into Text Field  description  ${arg}&lt;br /&gt;    Push Button  add&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Run the test and enjoy the greenness. Note, that the user keyword: Insert Todo Item, uses embedded variable syntax. So the "Buy some milk" is provided to the keyword in the same cell.&lt;br /&gt;&lt;br /&gt;Great, but still no testing or assertions. We can easily fix that. Select the first (0th) item from the todolist and read the the selected value into an argument. The we can assert that the value is the same as we expect i.e. "Buy some milk".&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;*** settings ***&lt;br /&gt;Library  SwingLibrary&lt;br /&gt;Suite Setup  Start Test Application&lt;br /&gt;&lt;br /&gt;*** Test Cases ***&lt;br /&gt;Test Add Todo Item&lt;br /&gt;    Insert Todo Item Buy some milk&lt;br /&gt;    Select From List  todolist  0&lt;br /&gt;    ${item}=  Get Selected Value From List  todolist&lt;br /&gt;    Should Be Equal  ${item}  Buy some milk&lt;br /&gt;&lt;br /&gt;*** User Keywords ***&lt;br /&gt;Start Test Application&lt;br /&gt;    Start Application  org.robotframework.swing.testapp.examplesut.TodoListApplication&lt;br /&gt;    Select Main Window&lt;br /&gt;&lt;br /&gt;Insert Todo Item ${arg}&lt;br /&gt;    Insert Into Text Field  description  ${arg}&lt;br /&gt;    Push Button  add&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Run the test and it should pass.&lt;br /&gt;&lt;br /&gt;Write tests for the todo item deletion...&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2468094238199231967-8326987886608904369?l=hereberobots.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hereberobots.blogspot.com/feeds/8326987886608904369/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2468094238199231967&amp;postID=8326987886608904369' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2468094238199231967/posts/default/8326987886608904369'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2468094238199231967/posts/default/8326987886608904369'/><link rel='alternate' type='text/html' href='http://hereberobots.blogspot.com/2011/02/swingin-it.html' title='Swingin&apos; it'/><author><name>Kari Husa</name><uri>http://www.blogger.com/profile/09178451369966389710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2468094238199231967.post-908431047298887097</id><published>2011-02-11T21:31:00.008+02:00</published><updated>2011-03-08T14:48:50.268+02:00</updated><title type='text'>Too much sleep is better than not enough</title><content type='html'>Timing is an important aspect of automated testing. Tests should run in minimum time so that they give rapid feedback and are not bottle necks. But when testing complex systems some operations unfortunately just take time and this has to be handled in tests. This post is about handling those situation in tests.&lt;br /&gt;&lt;br /&gt;Usually the first solution is to use sleeps. A sleep (in Robot Framework BuiltIn.Sleep) does nothing for a specified time period and continues the test after this. A Sleep isn't usually the optimal solution as it doesn't guarantee anything else than that the give time has passed. In other words: It guarantees that the test will take longer and doesn't guarantee that the waited event has happened.&lt;br /&gt;&lt;br /&gt;Sleeps don't always work. This results in flickering tests.&lt;br /&gt;&lt;br /&gt;To make Sleep work always it has to be very long so that it will be enough for every environment where the system under test should work. This is most likely longer time than what it would take in average.&lt;br /&gt;&lt;br /&gt;Another solution for waiting is polling (or busy wait). In polling (in Robot Framework BuiltIn.Wait Until Keyword Succeeds) the waited condition is checked repeatedly until the condition passes or a timeout period expires. Polling guarantees that the waited event has happened.&lt;br /&gt;&lt;br /&gt;Polling will usually result in a less total time of test execution than using sleeps. Sometimes this doesn't happen. For example the polling check could exhaust the system under test. Repeating the keyword will also produce more test logs.&lt;br /&gt;&lt;br /&gt;If the repeated keyword takes enough time wait until could take more time than needed.&lt;br /&gt;For example keyword that would take 9 seconds, in a situation where there has to be at least 10 seconds of waiting before the keyword can succeed, it will take 27 seconds to execute the Wait Until Keyword Succeeds but it would take 19 seconds to sleep 10 seconds and then execute the keyword.&lt;br /&gt;&lt;br /&gt;Other methods to handle time:&lt;br /&gt; * If possible simulate the passing of time&lt;br /&gt; * Hollywood principle&lt;br /&gt; * First sleep and then use wait until keyword succeeds to minimize polling&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2468094238199231967-908431047298887097?l=hereberobots.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hereberobots.blogspot.com/feeds/908431047298887097/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2468094238199231967&amp;postID=908431047298887097' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2468094238199231967/posts/default/908431047298887097'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2468094238199231967/posts/default/908431047298887097'/><link rel='alternate' type='text/html' href='http://hereberobots.blogspot.com/2011/02/too-much-sleep-is-better-than-not.html' title='Too much sleep is better than not enough'/><author><name>Mikko Korpela</name><uri>http://www.blogger.com/profile/15817076154969501663</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2468094238199231967.post-3084575537143416835</id><published>2011-01-28T21:54:00.008+02:00</published><updated>2011-02-01T13:08:10.631+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='functional'/><category scheme='http://www.blogger.com/atom/ns#' term='robotframework'/><title type='text'>Functional Robot</title><content type='html'>Robot has some interesting keywords that allow users to make keywords that use function delegation or are higher order functions. Here are some examples that I think could be useful.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Keyword that opens and closes a resource&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Basic idea is to have keyword that does something (opens a resource) before executing a delegated keyword and does something (closes a resource) after it has executed the delegated keyword.&lt;br /&gt;&lt;br /&gt;Here is an example keyword that executes the argument keyword without producing log output.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;With No Logging&lt;br /&gt;    [Arguments]  @{keyword with args}&lt;br /&gt;    ${original log level}=  Set Log Level  NONE&lt;br /&gt;    ${result}=  Run Keyword  @{keyword with args}&lt;br /&gt;    Set Log Level  ${original log level}&lt;br /&gt;    [Return]  ${result}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Example use:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;With No Logging  Generated Huge Report  Is Valid&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Keyword for consuming unknown number of items&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Consume All&lt;br /&gt;    [Arguments]  ${producer function}  ${consumer function}&lt;br /&gt;    ${product}=  Run Keyword  ${producer function}&lt;br /&gt;    Run Keyword If  ${product}  ${consumer function}  ${product}&lt;br /&gt;    Run Keyword If  ${product}  Consume All  ${producer function}  ${consumer function}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Consume All&lt;/span&gt; keyword takes a function that produces items and another function that consumes those items. Item could be anything for example a web page url or a custom xml message from a server. &lt;span style="font-style:italic;"&gt;Consume All&lt;/span&gt; keyword stops when producer returns an empty value.&lt;br /&gt;This keyword is useful in situations where there isn't total control of the number of produced items or when that number isn't really interesting from the testing point of view or it takes too much time to first find the number of items and then go through all of them. For cases where the number of items or the list of items is easy to get robotframework has &lt;span style="font-weight:bold;"&gt;BuiltIn.Repeat Keyword&lt;/span&gt; and &lt;span style="font-weight:bold;"&gt;:FOR&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Example uses:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;All Server Messages Have Valid Hash&lt;br /&gt;  Consume All  Server.Pull Message  Validate Message Hash&lt;br /&gt;&lt;br /&gt;All Pages Contain Company Logo&lt;br /&gt;  Consume All  PageCrawler.Next Page  Page Contains Company Logo&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2468094238199231967-3084575537143416835?l=hereberobots.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hereberobots.blogspot.com/feeds/3084575537143416835/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2468094238199231967&amp;postID=3084575537143416835' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2468094238199231967/posts/default/3084575537143416835'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2468094238199231967/posts/default/3084575537143416835'/><link rel='alternate' type='text/html' href='http://hereberobots.blogspot.com/2011/01/functional-robot.html' title='Functional Robot'/><author><name>Mikko Korpela</name><uri>http://www.blogger.com/profile/15817076154969501663</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2468094238199231967.post-8243494650639552106</id><published>2010-12-06T10:20:00.000+02:00</published><updated>2010-12-06T10:20:40.834+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ATDD'/><category scheme='http://www.blogger.com/atom/ns#' term='robotframework'/><title type='text'>Acceptance Test Driven Development with an internal customer</title><content type='html'>In my experience and what I hear about problems with Acceptance Driven Development (ATDD)&amp;nbsp;practice, is that it's not easy to have the customer in the same room to create highest&amp;nbsp;abstraction&amp;nbsp;level Test Cases. This is of course a problem to business people and it might be a little bit hard to sell, if you don't have any experience of your own about the topic.&lt;br /&gt;&lt;br /&gt;One of the easier way how a corporation can start to practice this is to try it out with internal customers. Usually there should be a situation where the whole product is not created in one place. These kind of relationships are eg. platform vs. application, where platform is created in one part of organization and application(s) in another. It's easier to create Test Cases and get people in the same meeting room when they are close to each others and there are no company barriers.&lt;br /&gt;&lt;br /&gt;These&amp;nbsp;activities&amp;nbsp;aim to raise&amp;nbsp;competence&amp;nbsp;and good knowledge about&amp;nbsp;practice&amp;nbsp;inside&amp;nbsp;the company. ATDD of course aims for communication with real customers, but this is a good way to get hands-on.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2468094238199231967-8243494650639552106?l=hereberobots.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hereberobots.blogspot.com/feeds/8243494650639552106/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2468094238199231967&amp;postID=8243494650639552106' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2468094238199231967/posts/default/8243494650639552106'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2468094238199231967/posts/default/8243494650639552106'/><link rel='alternate' type='text/html' href='http://hereberobots.blogspot.com/2010/12/acceptance-test-driven-development-with.html' title='Acceptance Test Driven Development with an internal customer'/><author><name>Ismo Aro</name><uri>http://www.blogger.com/profile/14521048613570585740</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2468094238199231967.post-5877597725282360433</id><published>2010-10-25T14:04:00.003+03:00</published><updated>2010-10-25T14:42:06.847+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='robotframework'/><title type='text'>Robot framework training</title><content type='html'>I joined with Pekka Klärck and Ismo Aro to do my first Robot training and coaching sessions this October in Athens, Greece. It was a very nice way start coaching Robot usage with such an enthusiastic and eager to learn crowd. Many thanks to everybody who participated!&lt;br /&gt;&lt;br /&gt;In the (generally very positive) feedback that we gathered from the sessions two main points of criticism stand out:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Two days is a very short time to learn test automation with Robot (I don't think this is in any way Robot specific issue.)&lt;/li&gt;&lt;li&gt;People prefer learning by doing exercises over listening to me going on about the theory. Also it was pointed out that it would be nice to have more time for the exercises that we have.&lt;/li&gt;&lt;/ol&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_IZYZtroQWag/TMVoPzBxNcI/AAAAAAAAAAM/3a-7gGUHwuc/s1600/planning.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/_IZYZtroQWag/TMVoPzBxNcI/AAAAAAAAAAM/3a-7gGUHwuc/s320/planning.jpg" width="191" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Planning the next training&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;The first issue is really no surprise. Although the basic syntax and usage of Robot is very easy to learn, learning how to do test automation well in general takes time. Also for learning the more exotic features of Robot Framework, a course of two days is just a too short of a time. When giving Robot training we do usually stay for a few days afterwards to coach and help clients with their real tests. This is a very important part of the training and should be considered a part of the course really. (Maybe next time, I will ask for the feedback after the coaching is done also...)&lt;br /&gt;&lt;br /&gt;I do understand that the two day crash course into test automation with robot can be a bit like drinking from a fire hose. We have to think whether it would be better to give Robot training for example first one day, then coaching and some time for the people to try out what they learned and then after a week or so, to give a second day of training with more advanced concepts.&lt;br /&gt;&lt;br /&gt;The second point about more hands on training forces us to rethink how to present the more advanced concepts and also what concepts are really necessary in a basic training. It is a lot easier to cover many advanced concepts in one day when you just read them through from slides. To actually let the people try them out, we have to give them some time and therefore also to skip some subjects from the training. But in the end, I guess it is better to teach few things well, than a lot of things too quickly.&lt;br /&gt;&lt;br /&gt;This has been an important learning experience and we are looking forward to making the next training even better than this one.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2468094238199231967-5877597725282360433?l=hereberobots.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hereberobots.blogspot.com/feeds/5877597725282360433/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2468094238199231967&amp;postID=5877597725282360433' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2468094238199231967/posts/default/5877597725282360433'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2468094238199231967/posts/default/5877597725282360433'/><link rel='alternate' type='text/html' href='http://hereberobots.blogspot.com/2010/10/robot-framework-training.html' title='Robot framework training'/><author><name>Jussi Malinen</name><uri>http://www.blogger.com/profile/07108183250973045479</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_IZYZtroQWag/TMVoPzBxNcI/AAAAAAAAAAM/3a-7gGUHwuc/s72-c/planning.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2468094238199231967.post-6667831296281645822</id><published>2010-10-18T06:56:00.003+03:00</published><updated>2010-10-18T08:50:03.603+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='jython'/><category scheme='http://www.blogger.com/atom/ns#' term='robotframework'/><title type='text'>Creating Robot Framework jar distribution</title><content type='html'>As of Robot Framework 2.5.2, it is also distributed as a single stand alone jar file.&lt;br /&gt;&lt;br /&gt;The goal was to create a jar distribution with following properties:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Standalone executable jar file, i.e.&lt;i&gt; java -jar robotframework.jar mystest.txt&lt;/i&gt; would suffice to run tests.&lt;/li&gt;&lt;li&gt;The exit code of the above command must be the same as if &lt;i&gt;mytests.txt&lt;/i&gt; was executed with pybot.&lt;/li&gt;&lt;li&gt;There would also be a programmatic API to start Robot Framework test execution from any Java program&lt;/li&gt;&lt;/ul&gt;While there was a wealth of information about Jython-Java interaction available&amp;nbsp;in the net, I could not find a single set of instructions describing all the&amp;nbsp;necessary steps to create the required jar. &amp;nbsp;Since I was able to do it and&amp;nbsp;since the process is general, I decided to write it down.&lt;br /&gt;&lt;br /&gt;First requirement is the Jython standalone jar, which can be created with&amp;nbsp;the Jython installer. Following the instructions in the Jython Book, I&amp;nbsp;created three Java classes and one Python for the interaction. These&amp;nbsp;classes implement the one-to-one Jython object factory described in the &lt;a href="http://www.jython.org/jythonbook/en/1.0/JythonAndJavaIntegration.html#one-to-one-jython-object-factories"&gt;Jython&amp;nbsp;book&lt;/a&gt;. Source code of these classes is available in Robot Framework &lt;a href="http://code.google.com/p/robotframework/source/browse/#svn/trunk/src/java/org/robotframework"&gt;source repository&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The java classes had to (of course) be compiled before inserting them into the&amp;nbsp;jar file. Additionally, a &lt;i&gt;MANIFEST.MF&lt;/i&gt; file with correct main-class had to be&amp;nbsp;created. Once these were done, the files could be inserted into the Jython jar:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Robot Framework source code must be placed in &lt;i&gt;Lib&lt;/i&gt; directory inside the jar&lt;/li&gt;&lt;li&gt;The java code must be inserted starting from the root of the and according to package structure&lt;/li&gt;&lt;li&gt;The &lt;i&gt;MANIFEST.MF&lt;/i&gt; has be to in &lt;i&gt;META-INF&lt;/i&gt; directory&lt;/li&gt;&lt;/ul&gt;That's pretty standard stuff expect for one gotcha: Zip file format (and jar files&amp;nbsp;are Zip files) supports multiple entries with same path. Since the Jython jar&amp;nbsp;already contains &lt;i&gt;MANIFEST.MF&lt;/i&gt; and since Python's z&lt;i&gt;ipfile&lt;/i&gt; module does not support&amp;nbsp;overriding or removing entries, the first released version of the jar&amp;nbsp;distribution contained two manifest files. For reasons unknown to me, the one&amp;nbsp;we inserted was effective when the jar file was executed with &lt;i&gt;java&lt;/i&gt;, but&amp;nbsp;adding files to the jar file with &lt;i&gt;jar&lt;/i&gt;&amp;nbsp;failed because of the duplicate manifest.&lt;br /&gt;&lt;br /&gt;This was resolved by unpacking the Jython jar and replacing the &lt;i&gt;MANIFEST.MF&lt;/i&gt;&amp;nbsp;with our own on the file system before repackaging. .&lt;br /&gt;&lt;br /&gt;All the Python source files were compiled with Jython's &lt;i&gt;compileall&lt;/i&gt; module before they were inserted into the jar file. This presumably increases&amp;nbsp;performance slightly.&lt;br /&gt;&lt;br /&gt;I will probably do another post about how we finally got the jar distribution&amp;nbsp;uploaded to Maven central, since that's an interesting story too.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2468094238199231967-6667831296281645822?l=hereberobots.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hereberobots.blogspot.com/feeds/6667831296281645822/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2468094238199231967&amp;postID=6667831296281645822' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2468094238199231967/posts/default/6667831296281645822'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2468094238199231967/posts/default/6667831296281645822'/><link rel='alternate' type='text/html' href='http://hereberobots.blogspot.com/2010/10/as-of-robot-framework-2.html' title='Creating Robot Framework jar distribution'/><author><name>Janne</name><uri>http://www.blogger.com/profile/08405229122553595687</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2468094238199231967.post-552363422355377408</id><published>2010-10-07T13:05:00.000+03:00</published><updated>2010-10-18T08:51:00.459+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='robotframework'/><title type='text'>Implementing asynchronous Robot Framework keywords</title><content type='html'>Before tests can be run I have to start all the necessary systems (processes, servers, stuff and things). Let's imagine that there are multiple systems that need to be started. I would like to start them all at the same time and wait until they are all ready to rock 'n' roll before starting my tests (assume that it would take a lot longer if I started all the systems in sequence).&lt;br /&gt;&lt;br /&gt;So how to do this with Robot? Basic idea is to have re-usable keywords for starting each system and a keyword for waiting until the systems are ready so that testing can begin (and we don't have to use ugly and unreliable sleeps). Doing this on Robot keyword level makes it possible to have different combinations of systems in different tests.&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; border: 1px dashed rgb(153, 153, 153); line-height: 14px; padding: 5px; overflow: auto; width: 100%;"&gt;&lt;code&gt;*** Settings ***&lt;br /&gt;Documentation   Example of using parallel things&lt;br /&gt;Suite Setup     StartSystems&lt;br /&gt;Library         SystemStarterLibrary.py&lt;br /&gt;&lt;br /&gt;*** Test Cases ***&lt;br /&gt;... Here should be my tests&lt;br /&gt;&lt;br /&gt;*** Keywords ***&lt;br /&gt;StartSystems&lt;br /&gt;   ${SYSTEM1_STARTED}=  Asynchronously Start System 1&lt;br /&gt;   ${SYSTEM2_STARTED}=  Asynchronously Start System 2&lt;br /&gt;   Wait until  ${SYSTEM1_STARTED}  ${SYSTEM2_STARTED}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The way I'm going to implement this is by using python decorator that executes the function that it decorates in a separate thread. The decorated function will return the thread object so that it can be used to implement the waiting functionality.&lt;br /&gt;&lt;br /&gt;I'm using &lt;a href="http://code.activestate.com/recipes/576684-simple-threading-decorator/"&gt;this little code&lt;/a&gt; for the decorator.&lt;br /&gt;&lt;br /&gt;After I've imported that to my &lt;code&gt;SystemStarterLibrary.py&lt;/code&gt; I can implement system starter functions as normal functions.&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;@run_async&lt;br /&gt;def asynchronously_start_system_1():&lt;br /&gt;  .. do stuff to start system 1&lt;br /&gt;&lt;br /&gt;@run_async&lt;br /&gt;def asynchronously_start_system_2():&lt;br /&gt;  .. do stuff to start system 2&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now all I need to do is to implement &lt;code&gt;Wait until&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;def wait_until(*stuff):&lt;br /&gt;  for something in stuff :&lt;br /&gt;     something.join()&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This is kind of OK but it will wait forever if starting of some system will take forever. So it is better to have some timeout that will tricker setup failure after the timeout.&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;*** Keywords ***&lt;br /&gt;StartSystems&lt;br /&gt;    [Timeout]  5 minutes&lt;br /&gt;    ${SYSTEM1_STARTED}=  Asynch Start System 1&lt;br /&gt;    ${SYSTEM2_STARTED}=  Asynch Start System 2&lt;br /&gt;    Wait until  ${SYSTEM1_STARTED}  ${SYSTEM2_STARTED}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And that should do it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2468094238199231967-552363422355377408?l=hereberobots.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hereberobots.blogspot.com/feeds/552363422355377408/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2468094238199231967&amp;postID=552363422355377408' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2468094238199231967/posts/default/552363422355377408'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2468094238199231967/posts/default/552363422355377408'/><link rel='alternate' type='text/html' href='http://hereberobots.blogspot.com/2010/10/implementing-asynchronous-robot.html' title='Implementing asynchronous Robot Framework keywords'/><author><name>Mikko Korpela</name><uri>http://www.blogger.com/profile/15817076154969501663</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2468094238199231967.post-1673292902296445276</id><published>2010-10-07T08:40:00.000+03:00</published><updated>2010-10-18T08:51:00.459+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='robotframework'/><title type='text'>Hello World Robot Framework library</title><content type='html'>This is the way I did my first Robot Framework keyword library. It should show the basic steps to add your own python keywords.&lt;br /&gt;&lt;br /&gt;Let's do it in a test-driven way!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Failing test case&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Add a file called HelloWorld.txt. This is our robot test suite file.&lt;br /&gt;&lt;br /&gt;Add following text to the file:&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; border: 1px dashed rgb(153, 153, 153); line-height: 14px; padding: 5px; overflow: auto; width: 100%;"&gt;&lt;code&gt;*** Test Cases ***&lt;br /&gt;HelloWorld&lt;br /&gt;   Hello World&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;After this run &lt;code&gt;pybot HelloWorld.txt&lt;/code&gt; - this will execute your Hello World test case.&lt;br /&gt;Output should be something like:&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; border: 1px dashed rgb(153, 153, 153); line-height: 14px; padding: 5px; overflow: auto; width: 100%;"&gt;&lt;code&gt;==============================================================================&lt;br /&gt;HelloWorld                                                                   &lt;br /&gt;==============================================================================&lt;br /&gt;HelloWorld                                                            | FAIL |&lt;br /&gt;No keyword with name 'Hello World' found.&lt;br /&gt;------------------------------------------------------------------------------&lt;br /&gt;HelloWorld                                                            | FAIL |&lt;br /&gt;1 critical test, 0 passed, 1 failed&lt;br /&gt;1 test total, 0 passed, 1 failed&lt;br /&gt;==============================================================================&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now we have a failing test case! So we can begin to implement our super cool Hello World keyword.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Keyword file&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Add a file called HelloWorld.py to the same directory as our HelloWorld.txt test suite.&lt;br /&gt;&lt;br /&gt;Add following text to the file:&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; border: 1px dashed rgb(153, 153, 153); line-height: 14px; padding: 5px; overflow: auto; width: 100%;"&gt;&lt;code&gt;def hello_world():&lt;br /&gt;   print "HELLO WORLD!"&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now we have implemented our fine keyword that prints "HELLO WORLD!". Although our test still fails..&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Passing test case&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;We have to import our super cool library to our test suite. Add following lines to the HelloWorld.txt (before test cases):&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;*** Settings ***&lt;br /&gt;Library         HelloWorld.py&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;After this run &lt;code&gt;pybot HelloWorld.txt&lt;/code&gt; - and watch it PASS:&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;==============================================================================&lt;br /&gt;HelloWorld                                                                    &lt;br /&gt;==============================================================================&lt;br /&gt;HelloWorld.HelloWorld                                                         &lt;br /&gt;==============================================================================&lt;br /&gt;HelloWorld                                                            &amp;#124; PASS &amp;#124;&lt;br /&gt;------------------------------------------------------------------------------&lt;br /&gt;HelloWorld.HelloWorld                                                 &amp;#124; PASS &amp;#124;&lt;br /&gt;1 critical test, 1 passed, 0 failed&lt;br /&gt;1 test total, 1 passed, 0 failed&lt;br /&gt;==============================================================================&lt;br /&gt;HelloWorld                                                            &amp;#124; PASS &amp;#124;&lt;br /&gt;1 critical test, 1 passed, 0 failed&lt;br /&gt;1 test total, 1 passed, 0 failed&lt;br /&gt;==============================================================================&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Thats it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2468094238199231967-1673292902296445276?l=hereberobots.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hereberobots.blogspot.com/feeds/1673292902296445276/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2468094238199231967&amp;postID=1673292902296445276' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2468094238199231967/posts/default/1673292902296445276'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2468094238199231967/posts/default/1673292902296445276'/><link rel='alternate' type='text/html' href='http://hereberobots.blogspot.com/2010/10/hello-world-robot-framework-library.html' title='Hello World Robot Framework library'/><author><name>Mikko Korpela</name><uri>http://www.blogger.com/profile/15817076154969501663</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2468094238199231967.post-5265384817110493040</id><published>2010-10-07T08:09:00.000+03:00</published><updated>2010-10-18T08:51:00.460+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='robotframework'/><title type='text'>Installing Robot Framework on Ubuntu</title><content type='html'>Lately I've been learning to use the &lt;a href="http://www.robotframework.org"&gt;robot framework&lt;/a&gt;. These are my notes on how to install it.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Installing pybot - normal robot thing&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;First install python if it's not already installed.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;sudo apt-get install python&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Then install easy_install and robotframework.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;sudo apt-get install python-setuptools&lt;br /&gt;sudo easy_install robotframework&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;After this you should have pybot (normal robot thing) installed.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;pybot --version&lt;br /&gt;== Should output something like ==&gt;&lt;br /&gt;Robot Framework 2.5.4 (Python 2.6.5 on linux2)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Installing jybot - jython version of robot&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I'll assume you have done all the things to install pybot so far (it also installed jybot and all you have to do now is to install correct version of jython).&lt;br /&gt;&lt;br /&gt;First a word of warning: Ubuntu is still (you should check is this still valid point if your reading this in the future) using old version of Jython that doesn't work with current jybot.&lt;br /&gt;&lt;br /&gt;So we have to first download Jython 2.5 (or later) from &lt;a href="http://www.jython.org/downloads.html"&gt;jython webpage&lt;/a&gt;. Follow jythons installation instructions.&lt;br /&gt;&lt;br /&gt;Add JYTHON_HOME to PATH so that you can use it.&lt;br /&gt;&lt;br /&gt;After this jybot should work.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;jybot --version&lt;br /&gt;== Should output something like ==&gt;&lt;br /&gt;Robot Framework 2.5.4 (Jython 2.5.1 on java1.6.0_20)&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2468094238199231967-5265384817110493040?l=hereberobots.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hereberobots.blogspot.com/feeds/5265384817110493040/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2468094238199231967&amp;postID=5265384817110493040' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2468094238199231967/posts/default/5265384817110493040'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2468094238199231967/posts/default/5265384817110493040'/><link rel='alternate' type='text/html' href='http://hereberobots.blogspot.com/2010/10/installing-robot-framework-on-ubuntu.html' title='Installing Robot Framework on Ubuntu'/><author><name>Mikko Korpela</name><uri>http://www.blogger.com/profile/15817076154969501663</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2468094238199231967.post-3669319009407047174</id><published>2009-09-24T01:13:00.003+03:00</published><updated>2009-09-24T16:04:15.454+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='conferences'/><title type='text'>More conferences featuring Robot Framework</title><content type='html'>Before the summer I &lt;a href="http://hereberobots.blogspot.com/2009/05/conference-appearances.html"&gt;wrote about conferences&lt;/a&gt; I was going to talk about Robot Framework or Acceptance Test-Driven Development (ATDD) using it. Most of those conferences are already in the past and the feedback has been pretty positive. It seems that the number of users is growing steadily and a lot of that is probably due to these presentations.&lt;br /&gt;&lt;br /&gt;Here's an updated list of the conferences somehow featuring Robot Framework that are still ahead this year.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;PyCon India 2009&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;- 26th-27th September, Bengaluru, India&lt;br /&gt;- &lt;a href="http://in.pycon.org/2009"&gt;http://in.pycon.org/2009&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Sai Venkatakrishnan gives a talk titled &lt;a style="font-weight:bold;" href="http://in.pycon.org/2009/talkfull/7/"&gt;Driving Development using Examples - A Robot Framework Approach&lt;/a&gt;. The talk looks very interesting, and because the conferences looks also good otherwise and is pretty cheap, I highly recommend this to all Robot Framework users in Bengaluru.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Agile Testing Days&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;- 12th-14th October, Berlin, Germany&lt;br /&gt;- &lt;a href="http://www.agiletestingdays.com"&gt;http://www.agiletestingdays.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;As I already wrote earlier, I will give &lt;span style="font-weight:bold;"&gt;Introduction to Robot Framework&lt;/span&gt; talk with pretty self explaining content. A bigger news is that &lt;a href="http://testobsessed.com/"&gt;Elisabeth Hendrickson&lt;/a&gt; uses Robot Framework in her &lt;a style="font-weight:bold;" href="http://agiletestingdays.com/hendrickson.html"&gt;Acceptance Test Driven Development (ATDD) in Practice&lt;/a&gt; tutorial.&lt;br /&gt;&lt;br /&gt;Agile Testing Days has a really good speaker lineup and I'm really looking forward to it myself. As a speaker I got these discount codes to share with you: &lt;span style="font-style:italic;"&gt;SPEAKERSTUT010&lt;/span&gt; gives 10% discount for the tutorials and &lt;span style="font-style:italic;"&gt;SPEAKERCON020&lt;/span&gt; 20% for the conference.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Scandinavian Agile Conference 2009&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;- 15th-16th October, Helsinki, Finland&lt;br /&gt;- &lt;a href="http://www.scan-agile.org/"&gt;http://www.scan-agile.org/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Juha Rantanen and Janne Härkönen and I organize similar &lt;span style="font-weight:bold;"&gt;Executable Requirements in Practice&lt;/span&gt; workshop/presentation we did at XP 2009 conference. For more information see &lt;a href="http://code.google.com/p/robotframework/wiki/XP2009Workshop"&gt;http://code.google.com/p/robotframework/wiki/XP2009Workshop&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Scan-Agile is a local conference for me but you cannot really tell that from the excellent international speakers list.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2468094238199231967-3669319009407047174?l=hereberobots.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hereberobots.blogspot.com/feeds/3669319009407047174/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2468094238199231967&amp;postID=3669319009407047174' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2468094238199231967/posts/default/3669319009407047174'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2468094238199231967/posts/default/3669319009407047174'/><link rel='alternate' type='text/html' href='http://hereberobots.blogspot.com/2009/09/more-conferences-featuring-robot.html' title='More conferences featuring Robot Framework'/><author><name>Pekka Klärck</name><uri>http://www.blogger.com/profile/00901693165404242900</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='19' height='32' src='http://1.bp.blogspot.com/_mYL44Ff79Vc/Sf9n2_ZkcGI/AAAAAAAAAAM/rm3PE53PcDk/s1600-R/peke.png'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2468094238199231967.post-2826608781881123174</id><published>2009-06-08T02:23:00.014+03:00</published><updated>2009-06-08T17:10:15.609+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='robotframework'/><title type='text'>Comments to Robot Framework review by Gojko Adzic</title><content type='html'>Gojko Adzic organized &lt;a href="http://gojko.net/2009/06/04/agile-acceptance-testing-tools-roundup-videos/"&gt;Agile acceptance testing tools round-up&lt;/a&gt; on 27 May 2009 at &lt;a href="http://skillsmatter.com/"&gt;Skills Matter&lt;/a&gt; in London. One of the tools he presented was &lt;a href="http://robotframework.org"&gt;Robot Framework&lt;/a&gt; and he published &lt;a href="http://gojko.net/2009/05/28/robot-framework-review/"&gt;Robot Framework review&lt;/a&gt; on his &lt;a href="http://gojko.net/"&gt;blog&lt;/a&gt; afterwards. &lt;br /&gt;&lt;br /&gt;Gojko's review is very well written, especially thinking that it is mainly based on the documentation on the project pages. The review is also pretty positive which obviously makes me happy. I had a change to see his text already before the presentation and some of my comments are included in the blog post. After re-reading the text I decided to add few more comments here. The comments below are organized into same sections as in the original review.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Keywords&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It was great that Gojko spent some time to explain the keyword-driven concept behind Robot Framework and included my comment about how it makes the library API simple. I hope he had also shown that although this approach is simple, it's also very powerful and it is possible to create different kind of test cases using it. Robot Framework &lt;a href="http://code.google.com/p/robotframework/wiki/QuickStartGuide"&gt;Quick Start Guide&lt;/a&gt; has &lt;a href="http://robotframework.googlecode.com/svn/trunk/doc/quickstart/quickstart.html#test-cases"&gt;very good examples&lt;/a&gt; of "normal" keyword driven tests, data-driven tests, and tests using the behavior-driven development (BDD) style.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Organising and editing tests&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is a good section about creating tests. Unfortunately the example, taken from the examples we use for explaining complex features, is pretty technical. For example the earlier mentioned Quick Start Guide has examples that are much better as tests. Normally when I talk how tests are organized into files and directories, I also mention how trivial it is to put them into a version control system. This is probably obvious to everyone reading the review, though.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Filtering&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This section discusses tags and how they can be used for filtering tests and marking tests critical. Gojko's examples are very good, I especially like that they are from his own domain, and they illustrate these important features very well. The only thing I wish was mentioned too is how tags can be used to get statistics about passed and failed tests.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Compared to other tools&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Gojko writes that Robot Framework is best suited for scripting tasks. Although I totally agree that RF suits very well for traditional scripted test automation, I'd like to highlight that creating also other kind of tests is possible. This is illustrated by the examples in the Quick Start Guide, and the &lt;a href="http://code.google.com/p/rfdoc/wiki/ExecutableRequirements"&gt;executable requirements&lt;/a&gt; we created when developing &lt;a href="http://code.google.com/p/rfdoc/"&gt;RFDoc&lt;/a&gt; tool act as more realistic examples. In my opinion it is also a huge benefit that the same tool can be used for "normal" scripted testing, for creating BDD style executable specifications, and for constructing tabular examples with only input and output values. &lt;br /&gt;&lt;br /&gt;One of the many points where I fully agree with Gojko is that Robot Framework can be used for creating domain specific languages. This can actually be done on many levels. For example &lt;a href="http://code.google.com/p/robotframework-seleniumlibrary/"&gt;SeleniumLibrary&lt;/a&gt; has its own web specific language with keywords like &lt;span style="font-style:italic;"&gt;Click Link&lt;/span&gt; and &lt;span style="font-style:italic;"&gt;Title Should Be&lt;/span&gt;, application specific language could have  keywords like &lt;span style="font-style:italic;"&gt;Input Password&lt;/span&gt; or &lt;span style="font-style:italic;"&gt;Welcome Page Should Be Open&lt;/span&gt;, and finally on the specification level the language often sounds something like &lt;span style="font-style:italic;"&gt;Given a user has logged in&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Reports and logs&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The only bigger subject missing from the review was a section with this title. Reports and logs are something where Robot Framework is, at least in my opinion, ahead of other acceptance testing tools by a wide margin. The high-level &lt;a href="http://robotframework.googlecode.com/svn/tags/robotframework-2.1/doc/userguide/RobotFrameworkUserGuide.html#report-file"&gt;report&lt;/a&gt; can be used for visualizing the overall status, detailed &lt;a href="http://robotframework.googlecode.com/svn/tags/robotframework-2.1/doc/userguide/RobotFrameworkUserGuide.html#log-file"&gt;logs&lt;/a&gt; give accurate information about the test execution, and XML &lt;a href="http://robotframework.googlecode.com/svn/tags/robotframework-2.1/doc/userguide/RobotFrameworkUserGuide.html#output-file"&gt;outputs&lt;/a&gt; can be easily integrated e.g. with CI systems and even combined to generate higher level reports.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2468094238199231967-2826608781881123174?l=hereberobots.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hereberobots.blogspot.com/feeds/2826608781881123174/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2468094238199231967&amp;postID=2826608781881123174' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2468094238199231967/posts/default/2826608781881123174'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2468094238199231967/posts/default/2826608781881123174'/><link rel='alternate' type='text/html' href='http://hereberobots.blogspot.com/2009/06/comments-to-robot-framework-review-by.html' title='Comments to Robot Framework review by Gojko Adzic'/><author><name>Pekka Klärck</name><uri>http://www.blogger.com/profile/00901693165404242900</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='19' height='32' src='http://1.bp.blogspot.com/_mYL44Ff79Vc/Sf9n2_ZkcGI/AAAAAAAAAAM/rm3PE53PcDk/s1600-R/peke.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2468094238199231967.post-1860397465933177030</id><published>2009-05-25T03:00:00.006+03:00</published><updated>2009-10-08T00:11:29.163+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='conferences'/><title type='text'>Conference appearances</title><content type='html'>I have been fortunate to be accepted to speak at several conferences in 2009. All these talks and workshops are at least related to Robot Framework, and they are listed below in chronological order.&lt;br /&gt;&lt;br /&gt;UPDATE: See also &lt;a href="http://hereberobots.blogspot.com/2009/09/more-conferences-featuring-robot.html"&gt;a latter post&lt;/a&gt; about more conferences featuring Robot Framework.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;XP2009&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;- 25th-28th May, Sardinia, Italy&lt;br /&gt;- &lt;a href="http://xp2009.org"&gt;http://xp2009.org&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I organize a workshop titled &lt;span style="font-weight:bold;"&gt;Executable Requirements in Practice&lt;/span&gt; with fellow Robot Framework developers Juha Rantanen and Janne Härkönen. The workshop is scheduled for Thursday, 28th May 14:00-17:30 and more information about it can be found from &lt;a href="http://code.google.com/p/robotframework/wiki/XP2009Workshop"&gt;http://code.google.com/p/robotframework/wiki/XP2009Workshop&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;EuroPython&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;- 28th June-4th July, Birmingham, UK&lt;br /&gt;- &lt;a href="http://europython.eu"&gt;http://europython.eu&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;My talk &lt;span style="font-weight:bold;"&gt;Acceptance Testing with Robot Framework&lt;/span&gt; will introduce the audience to Robot Framework and explain how to extend it with Python. For more information see &lt;a href="http://www.europython.eu/talks/talk_abstracts/#talk33"&gt;http://www.europython.eu/talks/talk_abstracts/#talk33&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.europython.eu/" title="EuroPython"&gt;&lt;img alt="EuroPython 2009" class="attachment" src="http://wiki.europython.eu/Publicity?action=AttachFile&amp;amp;do=get&amp;amp;target=europython_speaking_126x70.png" title="EuroPython 2009" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Agile 2009&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;- 24th-28th August, Chicago, USA&lt;br /&gt;- &lt;a href="http://agile2009.com"&gt;http://agile2009.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://testobsessed.com"&gt;Elisabeth Hendrickson&lt;/a&gt; and I organize a demonstration titled &lt;span style="font-weight:bold;"&gt;Acceptance Test Driven Development (ATDD) in Practice&lt;/span&gt;. It is scheduled for Tuesday, 25th August 16:00-17:30, and we'll be presenting on the Main Stage. Full details are available at &lt;a href="http://agile2009.com/node/641"&gt;http://agile2009.com/node/641&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.agile2009.org/" title="Agile 2009"&gt;&lt;img alt="Agile 2009" src="http://www.agile2009.org/files/Agile2009_WebBadges_Speaker.png" title="Agile 2009" width="150" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Agile Testing Days&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;- 12th-14th October, Berlin, Germany&lt;br /&gt;- &lt;a href="http://www.agiletestingdays.com"&gt;http://www.agiletestingdays.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I give a talk &lt;span style="font-weight:bold;"&gt;Introduction to Robot Framework&lt;/span&gt; with pretty self explaining content.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2468094238199231967-1860397465933177030?l=hereberobots.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hereberobots.blogspot.com/feeds/1860397465933177030/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2468094238199231967&amp;postID=1860397465933177030' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2468094238199231967/posts/default/1860397465933177030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2468094238199231967/posts/default/1860397465933177030'/><link rel='alternate' type='text/html' href='http://hereberobots.blogspot.com/2009/05/conference-appearances.html' title='Conference appearances'/><author><name>Pekka Klärck</name><uri>http://www.blogger.com/profile/00901693165404242900</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='19' height='32' src='http://1.bp.blogspot.com/_mYL44Ff79Vc/Sf9n2_ZkcGI/AAAAAAAAAAM/rm3PE53PcDk/s1600-R/peke.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2468094238199231967.post-1576124867637829623</id><published>2009-05-05T01:18:00.002+03:00</published><updated>2009-05-05T02:20:56.811+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='admin'/><title type='text'>The (in)famous first post</title><content type='html'>Hello, world! My name is Pekka Klärck and I'm a tester-developer and software contractor from Finland. I am also the lead developer of &lt;a href="http://robotframework.org"&gt;Robot Framework&lt;/a&gt;, a highly flexible open source acceptance testing framework. I work through my one-man company &lt;a href="http://eliga.fi"&gt;Eliga Oy&lt;/a&gt; and you can find some more information about me and my services from those pages.&lt;br /&gt;&lt;br /&gt;This blog is likely to contain a lot of posts somehow related to Robot Framework. Other topics that are likely to show up include test automation in general, Agile testing and  Python programming. I don't plan to use this blog too much for personal posts, but that doesn't mean that I wouldn't ever write about my favorite hobbies like telemark skiing. &lt;br /&gt;&lt;br /&gt;I've been thinking about starting a blog nearly a year and I'm happy to finally get this first post off my back. I hope it doesn't take that long time until the first post with some real content!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2468094238199231967-1576124867637829623?l=hereberobots.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hereberobots.blogspot.com/feeds/1576124867637829623/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2468094238199231967&amp;postID=1576124867637829623' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2468094238199231967/posts/default/1576124867637829623'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2468094238199231967/posts/default/1576124867637829623'/><link rel='alternate' type='text/html' href='http://hereberobots.blogspot.com/2009/05/infamous-first-post.html' title='The (in)famous first post'/><author><name>Pekka Klärck</name><uri>http://www.blogger.com/profile/00901693165404242900</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='19' height='32' src='http://1.bp.blogspot.com/_mYL44Ff79Vc/Sf9n2_ZkcGI/AAAAAAAAAAM/rm3PE53PcDk/s1600-R/peke.png'/></author><thr:total>0</thr:total></entry></feed>
