Michał Czyż

User perspective testing, using Ruby

This video was recorded on http://wrocloverb.com. You should follow us at https://twitter.com/wrocloverb. See you next year!

In this video Michał will show you why he took more object oriented approach, taking user's perspective for writing integration and acceptance tests.

wroc_love.rb 2012

00:00:13.200 Welcome, everybody.
00:00:19.520 I would like to talk a little about GUI testing.
00:00:24.880 First, I want to share whether I work or contribute on the blog. I also do a lot of open source from time to time.
00:00:30.400 Going back to the main topic, GUI testing has often been misused. There are many differing opinions on the subject. It's valuable to listen to critics because if you pay close attention, you can identify what the real issues are.
00:00:43.680 Critics often try to educate others about testing, encouraging them to think differently and understand the value of what effective testing can bring. This generally leads to the realization that good testing practices differ significantly from unit testing.
00:01:01.920 With GUI testing, you're not just validating a single core method anymore; there are a lot of dependencies involved. Therefore, it becomes more complicated to determine when and how to write tests. This complexity arises from the architecture of applications, which must interact correctly between various components.
00:01:24.799 We understand that most systems do not operate with just a single user; rather, they support multiple users. The state of the system frequently depends on actions performed by users, the sequence of those actions, and the timing of when they occur.
00:01:52.720 When writing acceptance tests, we must account for these variables. Thus, the testing architecture is quite complex for this type of testing. You have scripts that execute, some DSLs from Capybara, and various drivers. In the typical scenario, the drivers have full functionality, but if you use Selenium or Webkit, you must go through an external browser process, all while managing the database state and connections.
00:02:18.560 While it's beneficial to work with real data that reflects accurate responses during testing, you also want to implement some form of caching in order to expedite the tests and avoid overusing APIs.
00:02:45.760 One new tool that may be unfamiliar to many of you is Cameleon, which builds on the Capybara framework. The idea behind Cameleon is to create a DSL and abstractions that facilitate the writing of tests that accurately imitate user behavior.
00:03:04.800 This concept has its roots in discussions from a year ago, where we were exploring testing approaches. I initially planned to present on Cucumber, but I knew that the guys from Roswell were not fans of it, which prompted me to understand their tools and practices first. This knowledge would enable me to participate in a more meaningful discussion with them.
00:03:57.840 Thus, we shifted focus from Cucumber back to Ruby to discover how to write maintainable and readable tests that ultimately offer value. Another tool that emerged from similar discussions is Barbecue.
00:04:52.640 Looking at Cameleon, it does not overwrite any Capybara methods but simply extends them. You can still call any Capybara method directly. However, certain methods that share the same namespace require you to execute them within the Capybara session context.
00:05:29.760 With Cameleon, we have five implemented methods. The first is the 'click' method, an essential action that users frequently take. It accommodates clicks on links, buttons, and other elements, allowing for a cleaner and more efficient way to perform actions in sequence.
00:06:32.160 The second method relates to forms, where filling in values is standardized. In Capybara, the methods are a bit mixed in how values are populated; however, we have unified the process. We always input the value first and support filling multiple fields simultaneously.
00:07:04.479 The next method allows for checking checkboxes or radio buttons, although there is no option to 'uncheck' a checkbox since that action does not exist within a browser's functionality. When dealing with selections, you can specify what values you want to choose from multiple options in a single method call.
00:07:46.880 The 'select' method allows for attaching files as well, using the relevant part of a file to put into the field. This structured approach helps streamline testing. Cameleon helps verify what users see and can assess presence on the page.
00:08:29.600 We can check for more than one text in a single call, hence allowing for efficiency in our tests. We can check links based on their URLs, and also verify images via their alt attributes or source attributes.
00:09:11.200 Moreover, we also verify values set in fields, maintaining consistency with checks that enable us to see if values are selected or unselected within forms, including support for multi-select scenarios.
00:09:55.040 Another aspect of testing involves verifying the order of elements that appear on the page. We use a simplified approach to confirm presence and ensure the correct order by preparing specific XPath queries that gather all values for comparison.
00:10:55.680 It's also useful to determine how many specific types of elements are present using CSS or custom selectors, while the opposite requires verifying non-existence of elements.
00:11:36.320 The architecture of multi-user platforms calls for ease in switching session contexts. Capybara supports multi-session testing, automatically assigning default sessions unless requested otherwise. Testing multiple sessions offers insights into user interactions.
00:12:44.080 I would like to share an example from Spree, which demonstrates complex integration tests that effectively verify if elements are present in the proper order while maintaining readability.
00:13:48.960 Additionally, we've noticed patterns in writing tests, such as repetitive fill-ins that make code complex. With Cameleon, we minimize redundancy and enhance readability, allowing us to group argument calls effectively.
00:14:49.440 This focus on reducing repetition allows us to clarify our test intentions, streamlining validation processes. Cameleon promotes clear scopes, enabling easier understanding of testing operations.
00:15:23.680 In a recorded video of an acceptance test, we illustrate managing multiple user sessions, as admins can interact with casual users. This showcases the back-and-forth between sessions in a real-world scenario.
00:16:27.360 An example scenario involves admin and user interactions where the admin assigns favorites and the user provides ratings, demonstrating the business value and functionality of the system being tested.
00:18:27.040 We evaluate the performance of our full testing suite, acknowledging that comprehensive coverage ensures successful verification of business objectives and encourages confidence in the system’s operational integrity.
00:19:25.680 Ultimately, we configure Cameleon to manage dependencies efficiently, streamlining its integration within the testing environment.
00:20:00.160 Cameleon allows us to debug our applications directly in the context of live tests, improving our overall development experience and enabling smoother error resolution.
00:20:59.919 I hope this presentation has shed light on the pragmatic implementation of testing strategies. I'm open to any questions you may have.
00:22:01.679 Regarding the integration between libraries, our goal is to optimize performance while minimizing conflicts by ensuring interoperability without compromising on the quality of the testing frameworks.
00:23:01.120 As we work on maintaining distinct methodologies, we are focused on refining our DSL to enhance test readability and maintainability.
00:24:03.360 In parallel execution scenarios, we have discovered significant performance improvements by separating processes and databases to speed up test execution.
00:25:00.880 We are always looking to streamline our workflows and maximize our testing capabilities, ultimately striving for clearer methodologies within our libraries.
00:26:07.680 I appreciate your insights and questions as we navigate the dynamic landscape of testing frameworks. Together, we can address the needs of modern applications and enhance development practices.
00:27:43.520 Thank you for your engagement today, and I look forward to collaborating in the future to build innovative solutions.
00:28:44.080 As we move forward, let's continue to grow our understanding of these tools and adapt them to our various development environments.
00:30:04.640 Thank you very much, and I hope to see you all next year!