This document discusses different techniques for testing software, including:
- Precise requirements definition, automatic requirements verification, code design, documentation, and catching errors to provide a safety net for code changes.
- Testing approaches like test-driven development (TDD), behavior-driven development (BDD), and outside-in testing.
- User perspective testing using Ruby, including examples of writing Cucumber features and RSpec examples.
- Using Kameleon to write acceptance tests with a DSL for interacting with the application. Examples are provided for clicking links, filling in forms, and asserting expected results.
How we are writing user perspective tests using tools rspec, capybara, kameleon. To get more readable & maintaiable integration and acceptance tests .
https://github.com/cs3b/kameleon
How we are writing user perspective tests using tools rspec, capybara, kameleon. To get more readable & maintaiable integration and acceptance tests .
https://github.com/cs3b/kameleon
Devs for Leokz e 7Masters - WTF Oriented ProgrammingFabio Akita
Apresentação que fiz tanto no evento online beneficente Devs for Leokz (https://www.eventials.com/eduardo.shiota/groups/devs-pelo-leokz/) e no 7Masters do Grupo iMasters. Sobre pérolas de programação tosca que encontramos em projetos de verdade mesmo! Aprenda o que NÃO se deve fazer nunca!
Dig Deeper into WordPress - WD Meetup CairoMohamed Mosaad
Dig deeper into WordPress is a presentation made for Web Designers Meetup in Cairo taken place on 17th Dec 2012.
Signup at WPMonkeys.com to get notified when awesome new WordPress related content is published.
Polymer - pleasant client-side programming with web componentspsstoev
Polymer is a new library for the web, built on top of Web Components. This new project from Google makes client-side programming with web components easy and pleasant. You can use these technologies to increase the expressiveness of HTML by creating new tags that can help you get straight to your task. Polymer also adds other instruments like two-way data-binding and a lot of shortcuts that make your code more declarative and easier to extend and maintain. Many people think that web components are the future of web programming, and Polymer allows you to harness that power right now. Already excited!?
[Quality Meetup] M. Górski, M. Boś - Testy UI w Espresso z farmą w tleFuture Processing
Michał i Mateusz przybliżyli tematykę testów automatycznych na platformę Android. Prelekcja rozpoczęła się od omówienia podstaw frameworka Espresso i przedstawienia, jak przy jego pomocy zbudować PageObjecty. Prelegenci przybliżyli również bardziej zaawansowane możliwości użycia Espresso m.in. na podstawie kilku przykładów z ich własnych projektów. Na koniec przeszli do zdalnego, równoległego wykonania testów, czyli uruchomienia ich w „chmurze”.
This presentation emphasis on How to connect a Play Application with Mysql as database in Scala.Play includes a simple data access layer called Anorm that uses plain SQL to interact with the database and provides an API to parse and transform the resulting datasets.
Symposium presented by projects from the JISC Institutional Approaches to Curriculum Design programme, exploring how varied representations of the curriculum can support stakeholder engagement, student choice, system interoperability, and better dialogues about educational issues.
Devs for Leokz e 7Masters - WTF Oriented ProgrammingFabio Akita
Apresentação que fiz tanto no evento online beneficente Devs for Leokz (https://www.eventials.com/eduardo.shiota/groups/devs-pelo-leokz/) e no 7Masters do Grupo iMasters. Sobre pérolas de programação tosca que encontramos em projetos de verdade mesmo! Aprenda o que NÃO se deve fazer nunca!
Dig Deeper into WordPress - WD Meetup CairoMohamed Mosaad
Dig deeper into WordPress is a presentation made for Web Designers Meetup in Cairo taken place on 17th Dec 2012.
Signup at WPMonkeys.com to get notified when awesome new WordPress related content is published.
Polymer - pleasant client-side programming with web componentspsstoev
Polymer is a new library for the web, built on top of Web Components. This new project from Google makes client-side programming with web components easy and pleasant. You can use these technologies to increase the expressiveness of HTML by creating new tags that can help you get straight to your task. Polymer also adds other instruments like two-way data-binding and a lot of shortcuts that make your code more declarative and easier to extend and maintain. Many people think that web components are the future of web programming, and Polymer allows you to harness that power right now. Already excited!?
[Quality Meetup] M. Górski, M. Boś - Testy UI w Espresso z farmą w tleFuture Processing
Michał i Mateusz przybliżyli tematykę testów automatycznych na platformę Android. Prelekcja rozpoczęła się od omówienia podstaw frameworka Espresso i przedstawienia, jak przy jego pomocy zbudować PageObjecty. Prelegenci przybliżyli również bardziej zaawansowane możliwości użycia Espresso m.in. na podstawie kilku przykładów z ich własnych projektów. Na koniec przeszli do zdalnego, równoległego wykonania testów, czyli uruchomienia ich w „chmurze”.
This presentation emphasis on How to connect a Play Application with Mysql as database in Scala.Play includes a simple data access layer called Anorm that uses plain SQL to interact with the database and provides an API to parse and transform the resulting datasets.
Symposium presented by projects from the JISC Institutional Approaches to Curriculum Design programme, exploring how varied representations of the curriculum can support stakeholder engagement, student choice, system interoperability, and better dialogues about educational issues.
Serverless is the most clickbaity title for an actually interesting thing. Despite the name, Serverless does not mean you’re not using a server, rather, the promise of Serverless is to no longer have to babysit a server. Scaling is done for you, you’re billed only for what you use. In this session, we’ll cover some key use cases for these functions within a Vue.js application: we’ll accept payments with stripe, we’ll gather geolocation data from Google Maps, and more! We’ll make it all work with Vue and Nuxt seamlessly, simplifying how to leverage this paradigm to be a workhorse for your application.
Slides from my talk at the GTA-PHP Meetup Group about getting mixed HTML / PHP code into objects using SOLID principles.
Meetup page: http://www.meetup.com/GTA-PHP-User-Group-Toronto/events/230656470/
Code is on github: https://github.com/zymsys/solid
David Kopal - Write better React with ReasonML - Codemotion Milan 2018Codemotion
Do you want to write better React? In that case, you shouldn’t use it with JavaScript. Why? Because JavaScript isn't compatible with React's core principles, meaning you need to mimic them using many external libraries. Fortunately, Reason is here and ready to help you out through writing safer and cleaner React code, thanks to its type system which is superior to TypeScript and Flow. You'll need much less dependencies and you get less complexity regarding the choices you need to make because React's core features are built-in in Reason.
Rails, Postgres, Angular, and Bootstrap: The Power StackDavid Copeland
Rails, Postgres, Angular, and Bootstrap are all powerful technologies in and of themselves. When used together, however, you get a powerful web application development stack that reduces friction between what you want for your users and what you can deliver.
Whilst LAMP continues to be a strong force in web-app development, there is also a new breed of technologies that are being used to build the next generation of hugely scalable applications. This presentation will share experiences using these new technologies to handle broadcast-sized audiences and the dynamics of TV viewing.
This session will cover how “The Cloud“ and HTML5 provide an excellent infrastructure for building large scale applications. It will look at some of the technologies that support rapid, scalable development including big data store Cassandra, cloud deployment platform Chef, and building best-of-breed single-page HTML5 applications running on multiple devices using Backbone.js.
Você provavelmente já ouviu falar de Elm e suas promessas incríveis, mas você não quer reescrever tudo do zero, nem deixar a comunidade React. E se você pudesse ter todos os benefícios de Elm, enquanto ainda usa seus componentes React, misturando JavaScript e uma linguagem mais simples e poderosa, com um excelente sistema de tipos? Venha conhecer então PureScript e a biblioteca Pux!
TechSupport/Ch 21 project.doc
1
Projects.doc
Project 21-1:
Add user authentication
For this project, you will use a secure connection and require all users to log in including customers, technicians, and administrators. (Required reading: chapters 1-6, 10, and 21)
The Home page
Operation
· If you’ve been using the starting Home page for these projects, you’ll have to replace it with a Home page like the one above.
· When the user clicks one of the links on the main menu, the application displays a login form that’s appropriate for the type of user.
The Admin Login page
Operation
· When the user enters a valid username and password, the Admin Menu page is displayed. Otherwise, the Admin Login page is displayed again.
· To log in, you can use “admin” as the username and “sesame” as the password.
The Admin Menu page
Operation
· To navigate to an application, the user can click on the appropriate link.
· The page displays a message that indicates the login status.
· To log out, the user can click on the Logout button. This displays the Main Menu page.
Specifications
· All pages should include a link to the Home page in the header for the page.
· Except for the Home page, all pages should use a secure (https) connection.
· No pages should allow an unauthorized user to access them. For example, only a user that’s logged in as an administrator should be able to access the Admin Menu page.
The Technician Login page
Operation
· When the user enters a valid technician email and password, the Select Incident page is displayed. Otherwise, the Technician Login page is displayed again.
The Select Incident page
Operation
· Same as project 20-3, but the bottom of the page displays a message about the technician that’s logged in and provides a Logout button that the technician can use to log out.
· If there are open incidents for the current technician, this page displays a table of incidents as shown in project 20-3.
· If there are no open incidents for the current technician, this page displays a message and a link as shown above. However, this link only displays new incidents if new incidents have been assigned to the technician.
The Customer Login page
Operation
· When the user enters a valid customer email and password, the Register Product page is displayed. Otherwise, the Customer Login page is displayed again.
The Register Product page
Operation
· Same as project 6-4, but the bottom of the page displays a message about the customer that’s logged in and provides a Logout button that the customer can use to log out.
TechSupport/ch21_tech_support/admin/admin_login.php
<?php include '../view/header.php'; ?>
<div id="main">
<h1>Admin Login</h1>
<form action="" method="post" id="aligned">
<input type="hidden" name="action" value="login" />
<label>Username:</label>
<input type="text" name="username" size="30" />
<br />
<label>Password:</label>
<input type="pa ...
Similar to [ HackFest.pl 2012] Testing - what for and how (20)
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024Tobias Schneck
As AI technology is pushing into IT I was wondering myself, as an “infrastructure container kubernetes guy”, how get this fancy AI technology get managed from an infrastructure operational view? Is it possible to apply our lovely cloud native principals as well? What benefit’s both technologies could bring to each other?
Let me take this questions and provide you a short journey through existing deployment models and use cases for AI software. On practical examples, we discuss what cloud/on-premise strategy we may need for applying it to our own infrastructure to get it to work from an enterprise perspective. I want to give an overview about infrastructure requirements and technologies, what could be beneficial or limiting your AI use cases in an enterprise environment. An interactive Demo will give you some insides, what approaches I got already working for real.
Connector Corner: Automate dynamic content and events by pushing a buttonDianaGray10
Here is something new! In our next Connector Corner webinar, we will demonstrate how you can use a single workflow to:
Create a campaign using Mailchimp with merge tags/fields
Send an interactive Slack channel message (using buttons)
Have the message received by managers and peers along with a test email for review
But there’s more:
In a second workflow supporting the same use case, you’ll see:
Your campaign sent to target colleagues for approval
If the “Approve” button is clicked, a Jira/Zendesk ticket is created for the marketing design team
But—if the “Reject” button is pushed, colleagues will be alerted via Slack message
Join us to learn more about this new, human-in-the-loop capability, brought to you by Integration Service connectors.
And...
Speakers:
Akshay Agnihotri, Product Manager
Charlie Greenberg, Host
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered QualityInflectra
In this insightful webinar, Inflectra explores how artificial intelligence (AI) is transforming software development and testing. Discover how AI-powered tools are revolutionizing every stage of the software development lifecycle (SDLC), from design and prototyping to testing, deployment, and monitoring.
Learn about:
• The Future of Testing: How AI is shifting testing towards verification, analysis, and higher-level skills, while reducing repetitive tasks.
• Test Automation: How AI-powered test case generation, optimization, and self-healing tests are making testing more efficient and effective.
• Visual Testing: Explore the emerging capabilities of AI in visual testing and how it's set to revolutionize UI verification.
• Inflectra's AI Solutions: See demonstrations of Inflectra's cutting-edge AI tools like the ChatGPT plugin and Azure Open AI platform, designed to streamline your testing process.
Whether you're a developer, tester, or QA professional, this webinar will give you valuable insights into how AI is shaping the future of software delivery.
UiPath Test Automation using UiPath Test Suite series, part 3DianaGray10
Welcome to UiPath Test Automation using UiPath Test Suite series part 3. In this session, we will cover desktop automation along with UI automation.
Topics covered:
UI automation Introduction,
UI automation Sample
Desktop automation flow
Pradeep Chinnala, Senior Consultant Automation Developer @WonderBotz and UiPath MVP
Deepak Rai, Automation Practice Lead, Boundaryless Group and UiPath MVP
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024Albert Hoitingh
In this session I delve into the encryption technology used in Microsoft 365 and Microsoft Purview. Including the concepts of Customer Key and Double Key Encryption.
Epistemic Interaction - tuning interfaces to provide information for AI supportAlan Dix
Paper presented at SYNERGY workshop at AVI 2024, Genoa, Italy. 3rd June 2024
https://alandix.com/academic/papers/synergy2024-epistemic/
As machine learning integrates deeper into human-computer interactions, the concept of epistemic interaction emerges, aiming to refine these interactions to enhance system adaptability. This approach encourages minor, intentional adjustments in user behaviour to enrich the data available for system learning. This paper introduces epistemic interaction within the context of human-system communication, illustrating how deliberate interaction design can improve system understanding and adaptation. Through concrete examples, we demonstrate the potential of epistemic interaction to significantly advance human-computer interaction by leveraging intuitive human communication strategies to inform system design and functionality, offering a novel pathway for enriching user-system engagements.
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...UiPathCommunity
💥 Speed, accuracy, and scaling – discover the superpowers of GenAI in action with UiPath Document Understanding and Communications Mining™:
See how to accelerate model training and optimize model performance with active learning
Learn about the latest enhancements to out-of-the-box document processing – with little to no training required
Get an exclusive demo of the new family of UiPath LLMs – GenAI models specialized for processing different types of documents and messages
This is a hands-on session specifically designed for automation developers and AI enthusiasts seeking to enhance their knowledge in leveraging the latest intelligent document processing capabilities offered by UiPath.
Speakers:
👨🏫 Andras Palfi, Senior Product Manager, UiPath
👩🏫 Lenka Dulovicova, Product Program Manager, UiPath
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...Ramesh Iyer
In today's fast-changing business world, Companies that adapt and embrace new ideas often need help to keep up with the competition. However, fostering a culture of innovation takes much work. It takes vision, leadership and willingness to take risks in the right proportion. Sachin Dev Duggal, co-founder of Builder.ai, has perfected the art of this balance, creating a company culture where creativity and growth are nurtured at each stage.
29. click "Products"
within('table.index) do
see :ordered => [ "apache baseball cap",
"zomg shirt" ]
end
click "admin_products_listing_name_title"
within('table.index') do
see :ordered => [ "zomg shirt",
"apache baseball cap"]
end
30. click "Orders"
within('table#listing_orders', :row => 1) do
click_link "R100"
end
click "Payments"
within('#payment_status') do
see("Payment: balance due")
end
within(:cell =>[2,2]) { see "$39.98" }
within(:cell =>[2,3]) { see "Credit Card" }
within(:cell =>[2,4]) { see "pending" }
67. click "Products"
within('table.index) do
see :ordered => [ "apache baseball cap",
"zomg shirt" ]
end
click "admin_products_listing_name_title"
within('table.index') do
see :ordered => [ "zomg shirt",
"apache baseball cap"]
end
77. act_as(:user) do
not_see 'IS OPEN',
'IS CLOSED'
within(:right_column) do
not_see 'Submit a proposal',
'Submit'
end
end
78. act_as(:admin) do
within(:menu) { click 'Set Contest' }
fill_in 'S vs C' => 'Name',
'2012-01-19 08:00:00' => 'starts at',
'2012-01-20 08:00:00' => 'ends at'
click 'Create Contest'
see 'Contest was successfully created'
end
79. Timecop.travel(2012, 1, 19, 8, 59, 55) do
act_as(:user) do
refresh_page
see 'IS CLOSED'
sleep 10
not_see 'IS CLOSED'
see 'IS OPEN'
end
end
80. Timecop.travel(2012, 1, 19, 9, 1, 1) do
act_as(:user) do
refresh_page
%w(ruby ... haml).each do |content|
fill_in content => 'proposal_content'
click 'Submit'
end
end
81. act_as(:admin) do
click 'Sticker proposals',
'Load more'
%w(ruby ... html).each do |c|
within(:proposal_with_content => c) do
click 'favorite'
end
end
end
82. act_as(:user) do
refresh_page
%w(...).each_with_index do |c, r|
within(:proposal_with_content => c) do
click "Rate #{r+1} out of 5"
end
end
end
83. act_as(:user) do
%w(ruby coffescript).each do |c|
within(:proposal_with_content => c) do
click 'Comment'
fill_in "sample text #{c}" => 'body'
click 'Create comment'
end
end
end
84. Timecop.travel(2012, 1, 20, 11, 10, 10) do
act_as(:admin) do
refresh_page
click 'Load more'
%w(html python).each do |c|
within(:proposal_with_content => c) do
click 'choose'
end
end
end
85. act_as(:user) do
refresh_page
click 'Gallery'
within(:ordered_list) do
see *(%w(html python))
not_see *(%w(ruby ... coffescript))
end
end
86. act_as(:admin) do
click 'Gallery', 'Add new production picture'
fill_in 'Sample title for picture' => 'Title',
:attach => {'pict.jpg' => 'Image'}
click 'Create Gallery image'
end
87. act_as(:user) do
click 'Gallery'
fill_in :select => {'S vs C' => 'contest_id'}
within(:gallery_list) do
see :image => 'Thumb_pict'
end
end
88. act_as(:admin) do
click 'Add new contest sticker'
fill_in 'Sample title for picture' => 'Title',
:attach => {'pict2.jpg' => 'Image'}
click 'Create Gallery image'
end
89. act_as(:user) do
click 'Gallery'
fill_in :select => {'S vs C' => 'contest_id'}
within(:gallery_list) do
see :image => 'Thumb_pict2'
end
end
93. SHARED DB CONNECTION
example: lib/kameleon/ext/active_record/
● shared_single_connection.rb
● shared_single_connection_with_spork.rb
94. HEADLESS
RSpec.configure do |config|
config.before(:suite) do
@headless = Headless.new(:display => '100')
@headless.start
end
config.after(:suite) do
@headless.stop if defined?(@headless)
end
end
require 'kameleon/ext/rspec/headless'
95. RIPL
config.after(:each) do
if exception = example.instance_variable_get(:@exception)
Ripl.start :binding => binding
end
end
example: lib/kameleon/utils/debug_console.rb
99. FIXTURES
--
-- PostgreSQL database dump
--
SET statement_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SET check_function_bodies = false;
SET client_min_messages = warning;
100. FACTORIES
10.times do |i|
banner = BannerMessage.new :content => "text_#{i}"
banner.origin_ip = "127.#{i+1}.#{i}.#{i}"
banner.save!
rand(6).times do |v|
vote = banner.votes.build
vote.origin_ip = "127.0.0.#{v}"
vote.cookies = {vote.banner_message_id.to_s =>
Time.now.to_s}
vote.save!
end
end
101. FACTORIES
FactoryGirl.define do
factory :comment do
sequence(:body) { |n| "this is #{n} comment!" }
banner_message
sequence(:origin_ip) { |n| "127.0.0.#{n}" }
user
end
end
###
10.times { Factory.create(:comment) }
121. INTEGRATION TEST
describe "fill in" do
before(:each) { visit('/form_elements') }
context "single value in field" do
it "text" do
see :empty => [ 'sampleEmptyInput',
'textarea2']
fill_in 'Value for sampleEmtyInput' => 'sampleEmptyInput',
'Value for textarea2' => 'textarea2'
see 'Value for textarea2' => 'textarea2',
'Value for sampleEmtyInput' => 'sampleEmptyInput'
end
it "checkbox" do
see :unchecked => 'Sample unchecked checkbox'
fill_in :check => 'Sample unchecked checkbox'
see :checked => 'Sample unchecked checkbox'
fill_in :uncheck => 'Sample checked checkbox'
see :unchecked => 'Sample checked checkbox'
end
122. INTEGRATION TEST
describe 'order' do
before(:each) { visit('/special_elements') }
it 'should see text in proper order' do
see :ordered => ['Michal Czyz', 'Tomasz Bak', 'Rafal Bromirski']
end
context 'raise error' do
it 'different order' do
expect do
see :ordered => ['Tomasz Bak', 'Michal Czyz', 'Rafal Bromirski']
end.to raise_error(RSpec::Expectations::ExpectationNotMetError)
end
it 'not all elements present' do
expect do
see :ordered => ['Michal Czyz', 'Lukas Bak', 'Rafal Bromirski']
end.to raise_error(RSpec::Expectations::ExpectationNotMetError)
end
end
end
123. INTEGRATION TEST
before(:each) do
post "/users", {
:user => {
:name => "Wookie 5", :email => "wookie5@selleo.com",
:roles => 4, "is_verified" => true, :groups => [20188052, 20180893]
}
}, SelleoSomeApi.headers
end
it { response.status.should == 201 }
subject do
JSON.parse(response.body)
end
it { subject["id"].should be_a(Fixnum) }
it { should include "email" => "wookie5@selleo.com" }
it { should include "name" => "Wookie 5" }
it { should include "roles" => 4 }
it { should include "is_active" => true }
it { should include "is_verified" => "true" }
126. UNIT TEST
describe "PARSING" do
before(:each) do
subject { CucumberFM::Feature.new('some_path') }
subject.stub(:raw).and_return(FEATURE_CONTENT)
cfm = mock(:cfm)
filter = CucumberFM::TagFilter.new('')
cfm.stub(:filter).and_return(filter)
subject.stub(:cfm).and_return(cfm)
end
it "should parse feature info" do
CucumberFM::FE::Info.should_receive(:new).with(subject, INFO_CONTENT)
subject.info
end
it "should parse background" do
CucumberFM::FE::Background.should_receive(:new).with(subject, BAC..._C)
subject.background
end
127. UNIT TEST
describe CucumberFM::FeatureElement::Info do
before(:all) do
raw = <<EOF
#{@comment_1 = "# some comment"}
@tag @mc
Feature: #{@title = "Tag filter"}
EOF
feature = CucumberFM::Feature.new('fake_path')
@info = CucumberFM::FeatureElement::Info.new(feature, raw)
end
it "should parse tags" do
@info.tags.should == %w(@tag @mc)
end
it "should parse comments lines" do
CucumberFM::FE::Comment.should_receive(:new).with(@info, @comment_1)
CucumberFM::FE::Comment.should_receive(:new).with(@info, @comment_2)
@info.should have(2).comments
end