SlideShare a Scribd company logo
Testing C# and ASP.net using RubyMeerkatalyst@Ben_HallBen@BenHall.me.ukBlog.BenHall.me.uk
London based C# MVPWeb Developer @ 7digital.com Working on a number of Open Source ProjectsCo-Author of Testing ASP.net Web Applicationshttp://www.testingaspnet.com
How we can apply Ruby testing techniques to C#	- In mindset	- In practice 1|	Object Level testing2|	Systems testing
WHY?http://www.flickr.com/photos/atomicpuppy/2132073976/
VALUE
Realised Ruby doesn’t have as many problems as .net
Natural Language
Test Driven DevelopmentTDD
I love writing tests upfront
Not sure about implementationAccording to various TDD books \ blogs
Help with an initial design but what about long term?
“Unit”
Testing C# and ASP.net using Ruby
Behaviour Driven DevelopmentBDD
Shift focusFinal Intent
Code Coverage
Context \ Specification
RSpechttp://www.flickr.com/photos/dodgsun/467076780/
Testing C# and ASP.net using Ruby
Ruby (via IronRuby)p = ProductController.new(nil)C#public class ProductController : Controller{IStoreService _service;   public ProductController(IStoreService service)   {      _service = service;   }}Thanks to TekPub for Kona sample
Define the contextC#public ActionResult Index(int? id){ProductListViewModel model = null;   if (id.HasValue)      model = _service.GetHomeModel(id.Value);   else      return RedirectToAction("Index", "Home");      return View(model);}Ruby (via IronRuby)describe ProductController, “Product homepage requested" do  context "when Category ID is empty" do  endendThanks to TekPub for Kona sample
Create the context$: << ‘../../Kona/bin/’require ‘Kona.dll’Include Kona::Controllersdescribe ProductController, “Product homepage requested" do  context "when Category ID is empty" do  endendThanks to TekPub for Kona sample
Create the contextrequire '../spec_helper‘describe ProductController, “Product homepage requested" do  context "when Category ID is empty" do  endendThanks to TekPub for Kona sample
Create the contextrequire '../spec_helper‘describe ProductController, “Product homepage requested" do  context "when Category ID is empty" do     before(:each) do        controller = ProductController.new nilcategory_id = nil        @result = controller.Indexcategory_id     end  endendThanks to TekPub for Kona sample
Define the specrequire '../spec_helper‘describe ProductController, “Product homepage requested" do  context “with empty Category ID" do     before(:each) do ... End    it "should redirect to main landing page" do         @result.route_values[‘controller'].should == ‘Index’	  @result.route_values[‘home'].should == ‘Home’    endendThanks to TekPub for Kona sample
Stubbing via caricaturecontext “with validCategory ID" do   Before(:each)view_model = product_list('Test Category')       service = isolate Services::IStoreServiceservice.when_receiving(:get_home_model).with(valid_category_id).return(view_model)       controller = ProductController.new service       @result = controller.Indexvalid_category_id   end   it “returns a view model” do      @result.view_model.should_not == nil   end   it “should return name of selected category” do      @result.view_model.selected_category.name.should == 'Test Category‘   endendThanks to TekPub for Kona sample
Tests and Databasesdescribe Services::StoreService do  before(:all) dosession = NHibernate::create_sessionNHibernate::insert_category session    Services::StoreService.new session    @model = service.get_home_model 0  end  it "should return constructed object" do    @model.should_notbe_nil  end  it "should return all categories from database" do    @model.Categories.to_a.Count.should == 1  endendThanks to TekPub for Kona sample
http://www.flickr.com/photos/buro9/298994863/WHY RUBY?
[Subject(typeof(HomeController))]public class when_the_navigation_controller_is_asked_for_the_header :           specification_for_navigation_controller{        static ActionResult result;        Establish context = () => identity_tasks.Stub(i => i.IsSignedIn()).Return(true);        Because of = () => result = subject.Menu();        It should_ask_the_identity_tasks_if_the_user_is_signed_in = () => identity_tasks.AssertWasCalled(x => x.IsSignedIn());        It should_return_the_default_view = () => result.ShouldBeAView().And().ViewName.ShouldBeEmpty();        It should_not_use_a_master_page = () => result.ShouldBeAView().And().MasterName.ShouldBeEmpty();        It should_set_the_view_model_property_to_a_new_menu_view_model = () =>result.Model<MenuViewModel>().ShouldNotBeNull();        It should_set_the_properties_of_the_view_model_correctly = () => result.Model<MenuViewModel>().IsLoggedIn.ShouldBeTrue();    }
describe HomeController, “When the navigation controller is asked for the header” do   before(:all) do       @identity_tasks.Stub(i => i.IsSignedIn()).Return(true);       @result = subject.Menu();    end   it “should ask the identity tasks if the user is signed in” do       @identity_tasks.did_receive(:is_signed_in) .should be_successful   end   it “should return the default view” do     @result.shouldbe_view     @result.view_name.shouldbe_empty   end   it “should not use a master page” do     @result.shouldbe_view     @result.master_name.shouldbe_empty   end  it “should set the view model property to a new menu view model” do     @result.shouldbe_view    @result.model.should_notbe_nil  end  it “should set the properties of the view model correctly” do     @result.model.is_logged_in.shouldbe_true  endend
Consider your test suite containing > 500 testsEach test matters.But each problem hurts more
Share specsshare_examples_for "unauthorized user" do    it 'sets an-error message' do result.view_model.error_message.should == "Sorry, you need to login to access."    end    it 'redirects to the login page' do result.view_name.should   end end describe CheckoutController do it_should_behave_like “unauthorized user“describe AccountController doit_should_behave_like “unauthorized user“
Include  additional functionalityrequire ‘nhibernate_helpers’require ‘product_creation_extensions’require  ‘customer_creation_extensions’describe ProductController do
model.Categories.to_a.Count.should == 1model.Categories.should have(1)module Matchers    class CountCheck    def initialize(expected)      @expected = expected    end    def matches?(actual)actual.to_a.Count() == @expected    end  end  def have(expected)CountCheck.new(expected)  endendDuck Typing FTW!
Dynamically create specsdef find_products(category)Product.Find(:all, :conditions=> “category #{category}”)enddescribe ‘products should be able to be added to basket' do    before(:all) do     @basket = Basket.new  endfind_products(‘Boots’).each do |p|    it “can add #{p.product_name} to basket" do      @basket.add_item p.id      @basket.should contain(p)     end  endend
INTEGRATION TESTShttp://www.flickr.com/photos/gagilas/2659695352/
I’m against integration testsOr at least 90% of them
Multiple Collaborators
Unmanageable nightmare
12 hour execution time?
5174 passed, 491 failed, 94 skipped
“Tests aren’t failing because of defects”
‘Nearly’ end-to-endWhile knowing about everything in the middle...
Becomes a pain to refactor
FEAR
FEAR
UNIT testing frameworks
Bad organisation
Increased duplicationOverlapUnit TestsIntegration TestsUI \ System \ Acceptance TestsOverlap
STOPPED
Unit TestsAcceptance Tests
Outside-in Development
Cucumberhttp://www.flickr.com/photos/vizzzual-dot-com/2738586453/
Feature: Creating a schedule	In Order to book meetings	The manager	Needs to be able to view a teams calendarScenario: View calendar of another viewGiven “Bob” has a public calendarWhen the manager views “Bob”’s calendarThen an empty calendar should be shown
Given /^”([^\"]*)” has a public calendar$/ do |user|   pendingEndWhen /^ the manager views “([^\"]*)”’s calendar$/ do |user|   pendingEndThen /^ an empty calendar should be shown $/ do   pendingend
Thanks to TekPub for Kona sample
Thanks to TekPub for Kona sample
Feature: Display Products  In order to browse the catalog  The customer  Needs to see productsScenario: Single featured product on homepage    Given the featured product "Adventure Works 20x30 Binoculars"    When I visit the homepage    Then I should see "Adventure Works 20x30 Binoculars" listed under "Featured"
WebRathttp://www.flickr.com/photos/whatwhat/22624256/
visitclick_linkfill_inclick_buttoncheck and uncheckchooseselectattach_file
Given /^the featured product "([^\"]*)"$/ do |product_name|Product.createproduct_name, ‘featured’end
When /^I visit the homepage$/ do  visit url + '/'end
Then /^I should see "([^\"]*)" listed under "([^\"]*)"$/ do |product, area|  within div_id(area) do |products|products.should contain(product)  endEnddef div_id(area)  "#" + area.downcase.underscoreend
Dynamically replacedenv_selenium.rbdef url  "http://www.website.local"endWebrat.configure do |config|config.mode = :seleniumconfig.application_framework = :externalconfig.selenium_browser_key = get_browser_key  puts "Executing tests using the browser #{config.selenium_browser_key}"enddef get_browser_key()  command = "*firefox"  command = ENV['BROWSER'] if ENV['BROWSER']  return commandend
cucumber --profile selenium browser=*firefoxcucumber --profile selenium browser=*safaricucumber --profile selenium browser=*iexplorecucumber --profile selenium browser=*googlechrome
cucumber --profile webratHEADLESS BROWSINGBY REPLACING ENV.RB
Scenario Outline: Blowout Specials    Given <product> in "Blowout Specials"    When I visit the homepage    Then I should see <product> listed under "Blowout Specials"    Examples:      | product                                                         |      |  "Cascade Fur-lined Hiking Boots"           |      |  "Trailhead Locking Carabiner"                 |      |  "Climbing Rope with Single Caribiner"   |
Before doopen_connectionempty_databaseendat_exit doempty_databaseendMultiple Hooks
Multiple extension frameworksTest command line applicationsTest Silverlight\FlexTest WPF based desktop applicationsExecute in parallel across multiple machines
HUGE RE-USE == VALUE
http://www.flickr.com/photos/leon_homan/2856628778/
Focus on finding true valueLook at other communities for advice, support and inspiration
@Ben_HallBen@BenHall.me.ukBlog.BenHall.me.ukhttp://lolcatgenerator.com/lolcat/120/
Lonestar
using Cuke4Nuke.Framework;usingNUnit.Framework;usingWatiN.Core;namespaceGoogle.StepDefinitions{    publicclassSearchSteps    {        Browser _browser;         [Before]        publicvoidSetUp()        {            _browser = new WatiN.Core.IE();        }        [After]        publicvoidTearDown()        {            if (_browser != null)            {                _browser.Dispose();            }        }        [When(@"^(?:I'm on|I go to) the search page$")]        publicvoidGoToSearchPage()        {            _browser.GoTo("http://www.google.com/");        }        [When("^I search for \"(.*)\"$")]        publicvoidSearchFor(string query)        {            _browser.TextField(Find.ByName("q")).TypeText(query);            _browser.Button(Find.ByName("btnG")).Click();        }        [Then("^I should be on the search page$")]        publicvoidIsOnSearchPage()        {            Assert.That(_browser.Title == "Google");        }        [Then("^I should see \"(.*)\" in the results$")]        publicvoidResultsContain(stringexpectedResult)        {            Assert.That(_browser.ContainsText(expectedResult));        }    }}
Given /^(?:I'm on|I go to) the search page$/ do  visit 'http://www.google.com'end When /^I search for "([^\"]*)"$/ do|query|  fill_in 'q', :with => query  click_button 'Google Search'end Then /^I should be on the search page$/ do dom.search('title').should == "Google"end Then /^I should see \"(.*)\" in the results$/ do|text|  response.should contain(text)end
SoftwareRecommended:IronRubyRubyCucumberRspecWebRatmechanizeSelenium RCselenium-clientCaricatureactiverecord-sqlserver-adapterOptional:XSP \ MonoJetBrain’sRubyMineJRubyCapybaraCelerityActive record active-record-model-generatorFakerGuid
Useful Linkshttp://www.github.com/BenHallhttp://blog.benhall.me.ukhttp://stevehodgkiss.com/2009/11/14/using-activerecord-migrator-standalone-with-sqlite-and-sqlserver-on-windows.htmlhttp://www.testingaspnet.comhttp://http://msdn.microsoft.com/en-us/magazine/dd434651.aspxhttp://msdn.microsoft.com/en-us/magazine/dd453038.aspxhttp://www.cukes.info
SQL Server and Rubygem install activerecord-sqlserver-adapterDownload dbi-0.2.2.zip Extract dbd\ADO.rb to ruby\site_ruby\1.8\DBD\ADO.rb

More Related Content

What's hot (20)

Angularjs
Angularjs
Ynon Perek
 
Solid angular
Solid angular
Nir Kaufman
 
Magento Indexes
Magento Indexes
Ivan Chepurnyi
 
Kiss PageObjects [01-2017]
Kiss PageObjects [01-2017]
Iakiv Kramarenko
 
RESTful services and OAUTH protocol in IoT
RESTful services and OAUTH protocol in IoT
Yakov Fain
 
Gae
Gae
guest0e51364
 
AngularJS best-practices
AngularJS best-practices
Henry Tao
 
5 Reasons To Love CodeIgniter
5 Reasons To Love CodeIgniter
nicdev
 
Intro to-rails-webperf
Intro to-rails-webperf
New Relic
 
Controller Testing: You're Doing It Wrong
Controller Testing: You're Doing It Wrong
johnnygroundwork
 
AtlasCamp 2015: Web technologies you should be using now
AtlasCamp 2015: Web technologies you should be using now
Atlassian
 
React Native Workshop - React Alicante
React Native Workshop - React Alicante
Ignacio Martín
 
Angular JS - Introduction
Angular JS - Introduction
Sagar Acharya
 
I Love codeigniter, You?
I Love codeigniter, You?
إسماعيل عاشور
 
Extend sdk
Extend sdk
Harsha Nagaraj
 
Automation Abstractions: Page Objects and Beyond
Automation Abstractions: Page Objects and Beyond
TechWell
 
Introduction to Unit Tests and TDD
Introduction to Unit Tests and TDD
Betclic Everest Group Tech Team
 
Easy tests with Selenide and Easyb
Easy tests with Selenide and Easyb
Iakiv Kramarenko
 
Understanding angular js
Understanding angular js
Aayush Shrestha
 
Ajax Applications with RichFaces and JSF 2
Ajax Applications with RichFaces and JSF 2
Max Katz
 
Kiss PageObjects [01-2017]
Kiss PageObjects [01-2017]
Iakiv Kramarenko
 
RESTful services and OAUTH protocol in IoT
RESTful services and OAUTH protocol in IoT
Yakov Fain
 
AngularJS best-practices
AngularJS best-practices
Henry Tao
 
5 Reasons To Love CodeIgniter
5 Reasons To Love CodeIgniter
nicdev
 
Intro to-rails-webperf
Intro to-rails-webperf
New Relic
 
Controller Testing: You're Doing It Wrong
Controller Testing: You're Doing It Wrong
johnnygroundwork
 
AtlasCamp 2015: Web technologies you should be using now
AtlasCamp 2015: Web technologies you should be using now
Atlassian
 
React Native Workshop - React Alicante
React Native Workshop - React Alicante
Ignacio Martín
 
Angular JS - Introduction
Angular JS - Introduction
Sagar Acharya
 
Automation Abstractions: Page Objects and Beyond
Automation Abstractions: Page Objects and Beyond
TechWell
 
Easy tests with Selenide and Easyb
Easy tests with Selenide and Easyb
Iakiv Kramarenko
 
Understanding angular js
Understanding angular js
Aayush Shrestha
 
Ajax Applications with RichFaces and JSF 2
Ajax Applications with RichFaces and JSF 2
Max Katz
 

Viewers also liked (12)

Unit 4 Project
Unit 4 Project
lilmxdkid
 
Tìm hiểu về website
Tìm hiểu về website
Thông Quan Logistics
 
Sinh hoat CLB tin hoc Komaba lan 2 - Phat bieu cua Ngoc
Sinh hoat CLB tin hoc Komaba lan 2 - Phat bieu cua Ngoc
Ngoc Dao
 
Asp net
Asp net
quanvn
 
Bai giang-lap-trinh-web-bang-asp
Bai giang-lap-trinh-web-bang-asp
Vu Nguyen Van
 
Asp
Asp
thinhtu
 
Controls
Controls
teach4uin
 
Intro To Asp Net And Web Forms
Intro To Asp Net And Web Forms
SAMIR BHOGAYTA
 
Note d'intention
Note d'intention
Virginie Colombel
 
Introduction to ASP.NET
Introduction to ASP.NET
Peter Gfader
 
Cookies and sessions
Cookies and sessions
Lena Petsenchuk
 
Developing an ASP.NET Web Application
Developing an ASP.NET Web Application
Rishi Kothari
 
Unit 4 Project
Unit 4 Project
lilmxdkid
 
Sinh hoat CLB tin hoc Komaba lan 2 - Phat bieu cua Ngoc
Sinh hoat CLB tin hoc Komaba lan 2 - Phat bieu cua Ngoc
Ngoc Dao
 
Asp net
Asp net
quanvn
 
Bai giang-lap-trinh-web-bang-asp
Bai giang-lap-trinh-web-bang-asp
Vu Nguyen Van
 
Intro To Asp Net And Web Forms
Intro To Asp Net And Web Forms
SAMIR BHOGAYTA
 
Introduction to ASP.NET
Introduction to ASP.NET
Peter Gfader
 
Developing an ASP.NET Web Application
Developing an ASP.NET Web Application
Rishi Kothari
 
Ad

Similar to Testing C# and ASP.net using Ruby (20)

Testing ASP.net and C# using Ruby (NDC2010)
Testing ASP.net and C# using Ruby (NDC2010)
Ben Hall
 
Testing survival Guide
Testing survival Guide
Thilo Utke
 
Do your test
Do your test
Yura Tolstik
 
Ruby on Rails testing with Rspec
Ruby on Rails testing with Rspec
Bunlong Van
 
Testing ASP.net Web Applications using Ruby
Testing ASP.net Web Applications using Ruby
Ben Hall
 
Building Large Web Applications That Are Easy to Maintain
Building Large Web Applications That Are Easy to Maintain
MarsBased
 
What NOT to test in your project
What NOT to test in your project
alexandre freire
 
Automated Testing with Ruby
Automated Testing with Ruby
Keith Pitty
 
When To Use Ruby On Rails
When To Use Ruby On Rails
dosire
 
Best Practice in Development
Best Practice in Development
mirrec
 
x 13118706 Artur Janka Project Presentation
x 13118706 Artur Janka Project Presentation
Artur Janka
 
War between Tools and Design 2016
War between Tools and Design 2016
Mark Windholtz
 
Testing for Agility: Bringing Testing into Everything
Testing for Agility: Bringing Testing into Everything
Camille Bell
 
Agile Web Development With Rails Third Edition Third Ruby Sam
Agile Web Development With Rails Third Edition Third Ruby Sam
xhessnanaj
 
Behavior Driven Development with Cucumber
Behavior Driven Development with Cucumber
Brandon Keepers
 
Venturing Into The Wild: A .NET Developer's Experience As A Ruby Developer
Venturing Into The Wild: A .NET Developer's Experience As A Ruby Developer
Jon Kruger
 
How To Test Everything
How To Test Everything
noelrap
 
2011-02-03 LA RubyConf Rails3 TDD Workshop
2011-02-03 LA RubyConf Rails3 TDD Workshop
Wolfram Arnold
 
Ruby On Rails Introduction
Ruby On Rails Introduction
Gustavo Andres Brey
 
Aki Salmi - Refactoring legacy code: a true story @ I T.A.K.E. Unconference 2...
Aki Salmi - Refactoring legacy code: a true story @ I T.A.K.E. Unconference 2...
Mozaic Works
 
Testing ASP.net and C# using Ruby (NDC2010)
Testing ASP.net and C# using Ruby (NDC2010)
Ben Hall
 
Testing survival Guide
Testing survival Guide
Thilo Utke
 
Ruby on Rails testing with Rspec
Ruby on Rails testing with Rspec
Bunlong Van
 
Testing ASP.net Web Applications using Ruby
Testing ASP.net Web Applications using Ruby
Ben Hall
 
Building Large Web Applications That Are Easy to Maintain
Building Large Web Applications That Are Easy to Maintain
MarsBased
 
What NOT to test in your project
What NOT to test in your project
alexandre freire
 
Automated Testing with Ruby
Automated Testing with Ruby
Keith Pitty
 
When To Use Ruby On Rails
When To Use Ruby On Rails
dosire
 
Best Practice in Development
Best Practice in Development
mirrec
 
x 13118706 Artur Janka Project Presentation
x 13118706 Artur Janka Project Presentation
Artur Janka
 
War between Tools and Design 2016
War between Tools and Design 2016
Mark Windholtz
 
Testing for Agility: Bringing Testing into Everything
Testing for Agility: Bringing Testing into Everything
Camille Bell
 
Agile Web Development With Rails Third Edition Third Ruby Sam
Agile Web Development With Rails Third Edition Third Ruby Sam
xhessnanaj
 
Behavior Driven Development with Cucumber
Behavior Driven Development with Cucumber
Brandon Keepers
 
Venturing Into The Wild: A .NET Developer's Experience As A Ruby Developer
Venturing Into The Wild: A .NET Developer's Experience As A Ruby Developer
Jon Kruger
 
How To Test Everything
How To Test Everything
noelrap
 
2011-02-03 LA RubyConf Rails3 TDD Workshop
2011-02-03 LA RubyConf Rails3 TDD Workshop
Wolfram Arnold
 
Aki Salmi - Refactoring legacy code: a true story @ I T.A.K.E. Unconference 2...
Aki Salmi - Refactoring legacy code: a true story @ I T.A.K.E. Unconference 2...
Mozaic Works
 
Ad

More from Ben Hall (20)

The Art Of Documentation - NDC Porto 2022
The Art Of Documentation - NDC Porto 2022
Ben Hall
 
The Art Of Documentation for Open Source Projects
The Art Of Documentation for Open Source Projects
Ben Hall
 
Three Years of Lessons Running Potentially Malicious Code Inside Containers
Three Years of Lessons Running Potentially Malicious Code Inside Containers
Ben Hall
 
Containers without docker
Containers without docker
Ben Hall
 
Deploying windows containers with kubernetes
Deploying windows containers with kubernetes
Ben Hall
 
The Art of Documentation and Readme.md for Open Source Projects
The Art of Documentation and Readme.md for Open Source Projects
Ben Hall
 
How Secure Are Docker Containers?
How Secure Are Docker Containers?
Ben Hall
 
The Challenges of Becoming Cloud Native
The Challenges of Becoming Cloud Native
Ben Hall
 
Scaling Docker Containers using Kubernetes and Azure Container Service
Scaling Docker Containers using Kubernetes and Azure Container Service
Ben Hall
 
The art of documentation and readme.md
The art of documentation and readme.md
Ben Hall
 
Experimenting and Learning Kubernetes and Tensorflow
Experimenting and Learning Kubernetes and Tensorflow
Ben Hall
 
Running .NET on Docker
Running .NET on Docker
Ben Hall
 
Real World Lessons on the Pain Points of Node.JS Application
Real World Lessons on the Pain Points of Node.JS Application
Ben Hall
 
Tips on solving E_TOO_MANY_THINGS_TO_LEARN with Kubernetes
Tips on solving E_TOO_MANY_THINGS_TO_LEARN with Kubernetes
Ben Hall
 
Deploying applications to Windows Server 2016 and Windows Containers
Deploying applications to Windows Server 2016 and Windows Containers
Ben Hall
 
The How and Why of Windows containers
The How and Why of Windows containers
Ben Hall
 
Lessons from running potentially malicious code inside containers
Lessons from running potentially malicious code inside containers
Ben Hall
 
Deploying Windows Containers on Windows Server 2016
Deploying Windows Containers on Windows Server 2016
Ben Hall
 
Learning Patterns for the Overworked Developer
Learning Patterns for the Overworked Developer
Ben Hall
 
Real World Lessons on the Pain Points of Node.js Applications
Real World Lessons on the Pain Points of Node.js Applications
Ben Hall
 
The Art Of Documentation - NDC Porto 2022
The Art Of Documentation - NDC Porto 2022
Ben Hall
 
The Art Of Documentation for Open Source Projects
The Art Of Documentation for Open Source Projects
Ben Hall
 
Three Years of Lessons Running Potentially Malicious Code Inside Containers
Three Years of Lessons Running Potentially Malicious Code Inside Containers
Ben Hall
 
Containers without docker
Containers without docker
Ben Hall
 
Deploying windows containers with kubernetes
Deploying windows containers with kubernetes
Ben Hall
 
The Art of Documentation and Readme.md for Open Source Projects
The Art of Documentation and Readme.md for Open Source Projects
Ben Hall
 
How Secure Are Docker Containers?
How Secure Are Docker Containers?
Ben Hall
 
The Challenges of Becoming Cloud Native
The Challenges of Becoming Cloud Native
Ben Hall
 
Scaling Docker Containers using Kubernetes and Azure Container Service
Scaling Docker Containers using Kubernetes and Azure Container Service
Ben Hall
 
The art of documentation and readme.md
The art of documentation and readme.md
Ben Hall
 
Experimenting and Learning Kubernetes and Tensorflow
Experimenting and Learning Kubernetes and Tensorflow
Ben Hall
 
Running .NET on Docker
Running .NET on Docker
Ben Hall
 
Real World Lessons on the Pain Points of Node.JS Application
Real World Lessons on the Pain Points of Node.JS Application
Ben Hall
 
Tips on solving E_TOO_MANY_THINGS_TO_LEARN with Kubernetes
Tips on solving E_TOO_MANY_THINGS_TO_LEARN with Kubernetes
Ben Hall
 
Deploying applications to Windows Server 2016 and Windows Containers
Deploying applications to Windows Server 2016 and Windows Containers
Ben Hall
 
The How and Why of Windows containers
The How and Why of Windows containers
Ben Hall
 
Lessons from running potentially malicious code inside containers
Lessons from running potentially malicious code inside containers
Ben Hall
 
Deploying Windows Containers on Windows Server 2016
Deploying Windows Containers on Windows Server 2016
Ben Hall
 
Learning Patterns for the Overworked Developer
Learning Patterns for the Overworked Developer
Ben Hall
 
Real World Lessons on the Pain Points of Node.js Applications
Real World Lessons on the Pain Points of Node.js Applications
Ben Hall
 

Recently uploaded (20)

FME for Good: Integrating Multiple Data Sources with APIs to Support Local Ch...
FME for Good: Integrating Multiple Data Sources with APIs to Support Local Ch...
Safe Software
 
FIDO Seminar: Evolving Landscape of Post-Quantum Cryptography.pptx
FIDO Seminar: Evolving Landscape of Post-Quantum Cryptography.pptx
FIDO Alliance
 
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
NTT DATA Technology & Innovation
 
Bridging the divide: A conversation on tariffs today in the book industry - T...
Bridging the divide: A conversation on tariffs today in the book industry - T...
BookNet Canada
 
Your startup on AWS - How to architect and maintain a Lean and Mean account J...
Your startup on AWS - How to architect and maintain a Lean and Mean account J...
angelo60207
 
FIDO Seminar: Targeting Trust: The Future of Identity in the Workforce.pptx
FIDO Seminar: Targeting Trust: The Future of Identity in the Workforce.pptx
FIDO Alliance
 
Oracle Cloud Infrastructure AI Foundations
Oracle Cloud Infrastructure AI Foundations
VICTOR MAESTRE RAMIREZ
 
Mastering AI Workflows with FME - Peak of Data & AI 2025
Mastering AI Workflows with FME - Peak of Data & AI 2025
Safe Software
 
Floods in Valencia: Two FME-Powered Stories of Data Resilience
Floods in Valencia: Two FME-Powered Stories of Data Resilience
Safe Software
 
Viral>Wondershare Filmora 14.5.18.12900 Crack Free Download
Viral>Wondershare Filmora 14.5.18.12900 Crack Free Download
Puppy jhon
 
High Availability On-Premises FME Flow.pdf
High Availability On-Premises FME Flow.pdf
Safe Software
 
Your startup on AWS - How to architect and maintain a Lean and Mean account
Your startup on AWS - How to architect and maintain a Lean and Mean account
angelo60207
 
Reducing Conflicts and Increasing Safety Along the Cycling Networks of East-F...
Reducing Conflicts and Increasing Safety Along the Cycling Networks of East-F...
Safe Software
 
Integration of Utility Data into 3D BIM Models Using a 3D Solids Modeling Wor...
Integration of Utility Data into 3D BIM Models Using a 3D Solids Modeling Wor...
Safe Software
 
vertical-cnc-processing-centers-drillteq-v-200-en.pdf
vertical-cnc-processing-centers-drillteq-v-200-en.pdf
AmirStern2
 
June Patch Tuesday
June Patch Tuesday
Ivanti
 
Down the Rabbit Hole – Solving 5 Training Roadblocks
Down the Rabbit Hole – Solving 5 Training Roadblocks
Rustici Software
 
Supporting the NextGen 911 Digital Transformation with FME
Supporting the NextGen 911 Digital Transformation with FME
Safe Software
 
Crypto Super 500 - 14th Report - June2025.pdf
Crypto Super 500 - 14th Report - June2025.pdf
Stephen Perrenod
 
FIDO Seminar: Perspectives on Passkeys & Consumer Adoption.pptx
FIDO Seminar: Perspectives on Passkeys & Consumer Adoption.pptx
FIDO Alliance
 
FME for Good: Integrating Multiple Data Sources with APIs to Support Local Ch...
FME for Good: Integrating Multiple Data Sources with APIs to Support Local Ch...
Safe Software
 
FIDO Seminar: Evolving Landscape of Post-Quantum Cryptography.pptx
FIDO Seminar: Evolving Landscape of Post-Quantum Cryptography.pptx
FIDO Alliance
 
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
NTT DATA Technology & Innovation
 
Bridging the divide: A conversation on tariffs today in the book industry - T...
Bridging the divide: A conversation on tariffs today in the book industry - T...
BookNet Canada
 
Your startup on AWS - How to architect and maintain a Lean and Mean account J...
Your startup on AWS - How to architect and maintain a Lean and Mean account J...
angelo60207
 
FIDO Seminar: Targeting Trust: The Future of Identity in the Workforce.pptx
FIDO Seminar: Targeting Trust: The Future of Identity in the Workforce.pptx
FIDO Alliance
 
Oracle Cloud Infrastructure AI Foundations
Oracle Cloud Infrastructure AI Foundations
VICTOR MAESTRE RAMIREZ
 
Mastering AI Workflows with FME - Peak of Data & AI 2025
Mastering AI Workflows with FME - Peak of Data & AI 2025
Safe Software
 
Floods in Valencia: Two FME-Powered Stories of Data Resilience
Floods in Valencia: Two FME-Powered Stories of Data Resilience
Safe Software
 
Viral>Wondershare Filmora 14.5.18.12900 Crack Free Download
Viral>Wondershare Filmora 14.5.18.12900 Crack Free Download
Puppy jhon
 
High Availability On-Premises FME Flow.pdf
High Availability On-Premises FME Flow.pdf
Safe Software
 
Your startup on AWS - How to architect and maintain a Lean and Mean account
Your startup on AWS - How to architect and maintain a Lean and Mean account
angelo60207
 
Reducing Conflicts and Increasing Safety Along the Cycling Networks of East-F...
Reducing Conflicts and Increasing Safety Along the Cycling Networks of East-F...
Safe Software
 
Integration of Utility Data into 3D BIM Models Using a 3D Solids Modeling Wor...
Integration of Utility Data into 3D BIM Models Using a 3D Solids Modeling Wor...
Safe Software
 
vertical-cnc-processing-centers-drillteq-v-200-en.pdf
vertical-cnc-processing-centers-drillteq-v-200-en.pdf
AmirStern2
 
June Patch Tuesday
June Patch Tuesday
Ivanti
 
Down the Rabbit Hole – Solving 5 Training Roadblocks
Down the Rabbit Hole – Solving 5 Training Roadblocks
Rustici Software
 
Supporting the NextGen 911 Digital Transformation with FME
Supporting the NextGen 911 Digital Transformation with FME
Safe Software
 
Crypto Super 500 - 14th Report - June2025.pdf
Crypto Super 500 - 14th Report - June2025.pdf
Stephen Perrenod
 
FIDO Seminar: Perspectives on Passkeys & Consumer Adoption.pptx
FIDO Seminar: Perspectives on Passkeys & Consumer Adoption.pptx
FIDO Alliance
 

Testing C# and ASP.net using Ruby

Editor's Notes

  • #6: Cost of defects to 0Every test needs to justify itselfBut not just justify, add value both during the initial development and going forward. After working on a number of large scale .net based automation projects I started to question how much value I was adding to the project. This lead me to look at other communities as inspiration
  • #8: More abstracted away... As such nicer for testingMore fluid, more human readable.Perfect for tests. This is why I looked at how I can start using Ruby both in practice and mindset
  • #10: Cleaner, more focused designDefining how it’s meant to workProvide documentation for myself and team members over coming monthsyears of projectRefactoring
  • #12: Naming Implementation might go though multiple interactions until I reach my desired behaviour.
  • #13: Or at least, that’s what I would like..Net Problems- Unit doesn’t represent the concept of real world software - Legacy where nothing is a unit - Mentoring
  • #15: System brings together different parts to solve a particular problem
  • #16: Behaviour can be isolated units like TDDBut also accept that it might involve a number of other classes Defining the behaviour of our system, means we aren’t too focused on
  • #17: Feature Coverage
  • #18: Often forgot in the .Net world...Started to come more maintain stream thanks to Aaron Jenson and Scott BellwareBounded contexts
  • #30: http://whocanhelpme.codeplex.com/Good example of how to use Mspec with MVC. Sadly, I think Rspec has a nicer syntax.Naming + tests are very good.
  • #64: get_div_id == “Design UI for Testability”
  • #66: get_div_id == “Design UI for Testability”
  • #67: get_div_id == “Design UI for Testability”
  • #68: get_div_id == “Design UI for Testability”
  • #69: get_div_id == “Design UI for Testability”