The document discusses a presentation about unit testing TripCase with Jasmine. It covers an overview of unit testing and what parts of an application are best suited for unit testing. It then discusses the specific challenges of unit testing TripCase and analyzes which parts of TripCase are reflexive and algorithmic and therefore good candidates for unit testing. It also covers test-driven development and includes an example of identifying unit test assertions for a hotel search story.
Reverse engineering and instrumentation of android appsGaurav Lochan
The document discusses different approaches for instrumenting Android apps to add network monitoring capabilities. It describes choosing to modify the app's dex file by disassembling it to Smali code, inserting instrumentation code, and reassembling it. This allows intercepting HTTP calls without requiring access to the app's source code or build process. The key benefits are that it works on any app and Android version without the app's code needing changes.
The document discusses best practices for testing web applications. It recommends integrating automated testing into the development workflow and automating as many steps as possible. Specific techniques mentioned include using tools like RSpec, Cucumber, and Selenium for automated testing, and Jenkins for continuous integration. The document provides guidance on writing tests for the most used, frequently changing, data-handling, and failure-prone parts of the code. It also discusses techniques like code coverage analysis, testing across browsers and devices, load testing, and integrating testing with version control and issue tracking systems.
This document discusses managing technical debt in software development. It defines technical debt as increasing complexity in a system from changes without maintaining structure. There are different types of common technical debts, such as developer effectiveness, observability, scalability, fault tolerance, architectural flexibility, and security. The document provides examples of questions to evaluate debts in each area. It advocates strategically taking on some debt by making APIs extensible and having sufficient testing. Overall, it recommends measuring and monitoring debt levels, and scheduling regular time to refactor and improve code quality.
This document discusses Android code templates, which use FreeMarker to generate boilerplate Android code and assets from simple UI parameters. It describes the default ADT templates, how they are located, and how to configure Eclipse to work with templates. It provides an overview of FreeMarker and demonstrates how to create a custom animation template using FreeMarker directives.
This document discusses test automation of web applications using Selenium. It covers Selenium IDE features, test cases and suites, Selenium commands, locators, variables, Ajax testing, extensions, cross-browser testing, alerts and debugging. The goal is to introduce the basics of Selenium and how to structure and execute automated tests of web applications.
The document discusses integrating CloudStack with Puppet for automated provisioning and configuration of virtual machines. It explains that CloudStack provides an API for provisioning VMs, while Puppet can configure the VMs into functional applications. Together they allow fully automated application stacks. It then provides an overview of Puppet's architecture, including facts, modules, resources, catalogs, and classification. It proposes using Puppet resources and facts to model and provision VMs through CloudStack based on their roles.
Reverse engineering and instrumentation of android appsGaurav Lochan
The document discusses different approaches for instrumenting Android apps to add network monitoring capabilities. It describes choosing to modify the app's dex file by disassembling it to Smali code, inserting instrumentation code, and reassembling it. This allows intercepting HTTP calls without requiring access to the app's source code or build process. The key benefits are that it works on any app and Android version without the app's code needing changes.
The document discusses best practices for testing web applications. It recommends integrating automated testing into the development workflow and automating as many steps as possible. Specific techniques mentioned include using tools like RSpec, Cucumber, and Selenium for automated testing, and Jenkins for continuous integration. The document provides guidance on writing tests for the most used, frequently changing, data-handling, and failure-prone parts of the code. It also discusses techniques like code coverage analysis, testing across browsers and devices, load testing, and integrating testing with version control and issue tracking systems.
This document discusses managing technical debt in software development. It defines technical debt as increasing complexity in a system from changes without maintaining structure. There are different types of common technical debts, such as developer effectiveness, observability, scalability, fault tolerance, architectural flexibility, and security. The document provides examples of questions to evaluate debts in each area. It advocates strategically taking on some debt by making APIs extensible and having sufficient testing. Overall, it recommends measuring and monitoring debt levels, and scheduling regular time to refactor and improve code quality.
This document discusses Android code templates, which use FreeMarker to generate boilerplate Android code and assets from simple UI parameters. It describes the default ADT templates, how they are located, and how to configure Eclipse to work with templates. It provides an overview of FreeMarker and demonstrates how to create a custom animation template using FreeMarker directives.
This document discusses test automation of web applications using Selenium. It covers Selenium IDE features, test cases and suites, Selenium commands, locators, variables, Ajax testing, extensions, cross-browser testing, alerts and debugging. The goal is to introduce the basics of Selenium and how to structure and execute automated tests of web applications.
The document discusses integrating CloudStack with Puppet for automated provisioning and configuration of virtual machines. It explains that CloudStack provides an API for provisioning VMs, while Puppet can configure the VMs into functional applications. Together they allow fully automated application stacks. It then provides an overview of Puppet's architecture, including facts, modules, resources, catalogs, and classification. It proposes using Puppet resources and facts to model and provision VMs through CloudStack based on their roles.
UEMB270: Software Distribution Under The HoodIvanti
This document summarizes the processes and workflow involved in software distribution tasks using Ivanti Interchange. It describes how tasks are created by the scheduler service on the core server and pushed to managed devices. The task handler proxy gathers task information from the database and sends it to the policy task handler, which discovers devices and pushes commands. The policy is published to the APM service and downloaded by PolicySync on devices. Troubleshooting tips are provided for issues on the core server or client side. An overview of changes coming to the portal manager is also provided.
Domino server and application performance in the real worlddominion
The document provides tips and strategies for optimizing Domino server performance, with a focus on addressing disk I/O bottlenecks. It recommends separating database files onto different physical disks based on I/O needs, avoiding journaling file systems for transaction logs, optimizing RAID configurations, and addressing inefficient views and design patterns that can degrade performance. Specific issues covered include transaction logging, indexing, database design, and application usage patterns.
This document provides an overview and introduction to stORM, a simple template-based Object Relational Mapping (ORM) library for Android. Key points include that stORM aims to provide an easy and convention-based way to map Android objects to SQLite tables using annotations with minimal performance overhead. It generates DAO and table classes but does not support modeling all possible relations or achieving absolute maximum performance.
Heroku is a platform as a service that allows developers to build, run, and operate applications entirely in the cloud. It supports Ruby, Java, Node.js, and other languages and frameworks. Heroku builds applications on Amazon Web Services infrastructure and provides automatic scaling of dynos (the lightweight Linux containers that run applications). Developers deploy code to Heroku using Git and the platform automatically distributes and runs the application across dynos.
The document provides an overview of creating and running a basic Rails application. It discusses generating a new Rails app called "roster" and the directory structure it creates. It describes the development, test, and production environments in Rails and additional configuration files. It also introduces the model-view-controller (MVC) pattern used in Rails applications and using scaffolds to quickly generate models, views, and controllers.
"Up-Down Development & DSL-first approach", Владимир Мельник, DataArtDataArt
The document discusses Up-Down Development and a DSL-first approach to software architecture. It describes splitting an application into layers, with the presentation layer at the top interacting with users, an application layer in the middle coordinating tasks, a domain layer storing business logic, and an infrastructure layer handling lower-level functions. Tests start at the presentation layer and make the UI dynamic by adding mocked lower layers. A DSL-first approach treats the DSL implementation as the system and code in the DSL as system rules, allowing great abstraction and splitting concerns. An example refactors a system using this approach.
In der Software-Entwicklung wird schon lange getestet, ob Code das tut, was er soll. Dasselbe Konzept lässt sich auf Container übertragen, um die Funktionalität und Sicherheit zu prüfen.
CloudFoundry and MongoDb, a marriage made in heavenPatrick Chanezon
This talk will provide an overview of the PaaS (Platform as a Service) landscape, and will describe the Cloud Foundry open source PaaS, with its multi-framework, multi-service, multi-cloud model. Cloud Foundry allows developers to provision apps in Java/Spring, Ruby/Rails, Ruby/Sinatra, Javascript/Node, and leverage services like MySQL, MongoDB, Reddis, Postgres and RabbitMQ. It can be used as a public PaaS on CloudFoundry.com and other service providers (ActiveState, AppFog), to create your own private cloud, or on your laptop using the Micro Cloud Foundry VM. Micro Cloud Foundry is a very easy way for developers to start working on their application using their framework of choice and MongoDB, without the need to setup a development environment, and your app is one command line away (vmc push) from deployment to cloudfoundry.com.
7 common problems with salesforce data migrationMark Kofman
The document discusses 7 common problems with Salesforce data migration: 1) CSV files can be imperfect and manipulating large CSV files is difficult, 2) dealing with Salesforce system/audit fields, 3) limitations of Group and Professional Editions, 4) API daily limits, 5) custom fields, 6) validation rules, and 7) testing data import quality. It then introduces Import2 as a solution for automated and online data migration with experience from over 100 migrations.
This document contains slides from a presentation about supporting SQL Server. The presentation provides an overview of how SQL Server works, including how data is stored physically and accessed. It discusses backup strategies, indexing, query optimization, high availability options and basic SQL queries. The presenter provides their contact information and offers to share additional resources.
Tools/Processes for serious android app developmentGaurav Lochan
I've managed a team that developed serious android apps, and ended up dabbling with tools out there and processes/systems. Here is a quick summary of the various things to think about if you're serious about android development, and in some cases, my recommendations.
This covers:
IDE
Build
Source Control
Bug/Task tracking
Crash reporting
Analytics
Test Automation
Continuous Integration
Device Matrix testing
Performance testing
Beta testing
A/B testing
Backend-as-a-Service
The document discusses continuous delivery (CD) and continuous integration (CI). It defines CD as automatically deploying code changes to a staging environment after builds and tests pass, while CI involves continuous building and testing of code changes. The document outlines benefits of CD like quicker turnaround and less deployment risk. It also discusses requirements for CD like integration with source control management and automated deployments. Additionally, it proposes solutions for complex workflows, database changes, and monolithic applications in a CD pipeline.
Backbone.js helps structure you javascript application code in a scalable way.
In this keynote I demonstrate how to use it in a simple walk-through example, and discuss the advantages of using an MVC framework.
NoSQL databases are non-relational databases designed for large volumes of data across many servers. They emerged to address scaling and reliability issues with relational databases. While different technologies, NoSQL databases are designed for distribution without a single point of failure and to sacrifice consistency for availability if needed. Examples include Dynamo, BigTable, Cassandra and CouchDB.
This document provides a summary of best practices for DevOps as outlined by Erik Osterman of Cloud Posse. It discusses practices across organizational structure, software development, infrastructure automation, monitoring and security. Some key best practices include: establishing a makers culture with uninterrupted focus time for developers; using containers for local development environments and tools; strict branch protection and pull requests for code changes; immutable infrastructure with infrastructure as code; actionable alerts and post-mortems for monitoring; and identity-aware access, temporary credentials, and multi-factor authentication for security. The document aims to share proven strategies that help achieve reliability, speed, ease of use and affordability of systems.
Ruby on Rails was presented to the Agile Atlanta group. The presentation provided an overview of Ruby, demonstrated the Rails framework, and described its principles and architecture in 3 sentences or less:
Ruby is an agile language and Ruby on Rails is its popular web application framework that promotes agile practices like convention over configuration and includes everything needed to build database-driven web apps according to the MVC pattern.
The document is a blog post that discusses enabling guided merge functionality in Oracle Customer Hub (Siebel UCM). It provides steps to call a workflow from the "Guided Merge" button, enable merge tasks, publish tasks, add responsibilities for access, and invoke the button. It also discusses adding new fields and deploying integration objects. Limitations are provided that guided merge only supports accounts and contacts.
MongoDB is the coolest NoSQL DB around, partially because it's simple-by-design philosophy. Without transactions or joins, all the bad vibe of SQL is gone.
In this presentation I demonstrate how to get started with MongoDB in the cloud using Mon
Continuous delivery a happier, safer alternative to release trainsThoughtworks
This document discusses principles and practices for continuous delivery including automating the build, deployment, testing and release process. It emphasizes reducing risk through techniques like feature toggles, blue-green deployments, canary releasing and implementing a production immune system. It also stresses the importance of collaboration between developers, testers and operations personnel.
JDD2015: Sustainability Supporting Data Variability: Keeping Core Components ...PROIDEA
SUSTAINABILITY SUPPORTING DATA VARIABILITY: KEEPING CORE COMPONENTS CLEAN WHILE DEALING WITH DATA VARIABILITY
A big challenge in building complex, data-intensive systems is how to sustainably support data variation, schema, and feature evolution. This talk examines strategies, practices, and patterns drawn from real experiences that support new and evolving data-processing requirements while keeping the core architecture clean. As complex systems evolve to meet varying data formats, they can devolve into poorly architected Big Balls of Mud filled with special-case logic and one-off processing. Alternatively, you can isolate core components of your system and protect them from entanglements and unnecessary complexity by designing them to operate on common data formats while providing extension mechanisms that enable processing variations.
UEMB270: Software Distribution Under The HoodIvanti
This document summarizes the processes and workflow involved in software distribution tasks using Ivanti Interchange. It describes how tasks are created by the scheduler service on the core server and pushed to managed devices. The task handler proxy gathers task information from the database and sends it to the policy task handler, which discovers devices and pushes commands. The policy is published to the APM service and downloaded by PolicySync on devices. Troubleshooting tips are provided for issues on the core server or client side. An overview of changes coming to the portal manager is also provided.
Domino server and application performance in the real worlddominion
The document provides tips and strategies for optimizing Domino server performance, with a focus on addressing disk I/O bottlenecks. It recommends separating database files onto different physical disks based on I/O needs, avoiding journaling file systems for transaction logs, optimizing RAID configurations, and addressing inefficient views and design patterns that can degrade performance. Specific issues covered include transaction logging, indexing, database design, and application usage patterns.
This document provides an overview and introduction to stORM, a simple template-based Object Relational Mapping (ORM) library for Android. Key points include that stORM aims to provide an easy and convention-based way to map Android objects to SQLite tables using annotations with minimal performance overhead. It generates DAO and table classes but does not support modeling all possible relations or achieving absolute maximum performance.
Heroku is a platform as a service that allows developers to build, run, and operate applications entirely in the cloud. It supports Ruby, Java, Node.js, and other languages and frameworks. Heroku builds applications on Amazon Web Services infrastructure and provides automatic scaling of dynos (the lightweight Linux containers that run applications). Developers deploy code to Heroku using Git and the platform automatically distributes and runs the application across dynos.
The document provides an overview of creating and running a basic Rails application. It discusses generating a new Rails app called "roster" and the directory structure it creates. It describes the development, test, and production environments in Rails and additional configuration files. It also introduces the model-view-controller (MVC) pattern used in Rails applications and using scaffolds to quickly generate models, views, and controllers.
"Up-Down Development & DSL-first approach", Владимир Мельник, DataArtDataArt
The document discusses Up-Down Development and a DSL-first approach to software architecture. It describes splitting an application into layers, with the presentation layer at the top interacting with users, an application layer in the middle coordinating tasks, a domain layer storing business logic, and an infrastructure layer handling lower-level functions. Tests start at the presentation layer and make the UI dynamic by adding mocked lower layers. A DSL-first approach treats the DSL implementation as the system and code in the DSL as system rules, allowing great abstraction and splitting concerns. An example refactors a system using this approach.
In der Software-Entwicklung wird schon lange getestet, ob Code das tut, was er soll. Dasselbe Konzept lässt sich auf Container übertragen, um die Funktionalität und Sicherheit zu prüfen.
CloudFoundry and MongoDb, a marriage made in heavenPatrick Chanezon
This talk will provide an overview of the PaaS (Platform as a Service) landscape, and will describe the Cloud Foundry open source PaaS, with its multi-framework, multi-service, multi-cloud model. Cloud Foundry allows developers to provision apps in Java/Spring, Ruby/Rails, Ruby/Sinatra, Javascript/Node, and leverage services like MySQL, MongoDB, Reddis, Postgres and RabbitMQ. It can be used as a public PaaS on CloudFoundry.com and other service providers (ActiveState, AppFog), to create your own private cloud, or on your laptop using the Micro Cloud Foundry VM. Micro Cloud Foundry is a very easy way for developers to start working on their application using their framework of choice and MongoDB, without the need to setup a development environment, and your app is one command line away (vmc push) from deployment to cloudfoundry.com.
7 common problems with salesforce data migrationMark Kofman
The document discusses 7 common problems with Salesforce data migration: 1) CSV files can be imperfect and manipulating large CSV files is difficult, 2) dealing with Salesforce system/audit fields, 3) limitations of Group and Professional Editions, 4) API daily limits, 5) custom fields, 6) validation rules, and 7) testing data import quality. It then introduces Import2 as a solution for automated and online data migration with experience from over 100 migrations.
This document contains slides from a presentation about supporting SQL Server. The presentation provides an overview of how SQL Server works, including how data is stored physically and accessed. It discusses backup strategies, indexing, query optimization, high availability options and basic SQL queries. The presenter provides their contact information and offers to share additional resources.
Tools/Processes for serious android app developmentGaurav Lochan
I've managed a team that developed serious android apps, and ended up dabbling with tools out there and processes/systems. Here is a quick summary of the various things to think about if you're serious about android development, and in some cases, my recommendations.
This covers:
IDE
Build
Source Control
Bug/Task tracking
Crash reporting
Analytics
Test Automation
Continuous Integration
Device Matrix testing
Performance testing
Beta testing
A/B testing
Backend-as-a-Service
The document discusses continuous delivery (CD) and continuous integration (CI). It defines CD as automatically deploying code changes to a staging environment after builds and tests pass, while CI involves continuous building and testing of code changes. The document outlines benefits of CD like quicker turnaround and less deployment risk. It also discusses requirements for CD like integration with source control management and automated deployments. Additionally, it proposes solutions for complex workflows, database changes, and monolithic applications in a CD pipeline.
Backbone.js helps structure you javascript application code in a scalable way.
In this keynote I demonstrate how to use it in a simple walk-through example, and discuss the advantages of using an MVC framework.
NoSQL databases are non-relational databases designed for large volumes of data across many servers. They emerged to address scaling and reliability issues with relational databases. While different technologies, NoSQL databases are designed for distribution without a single point of failure and to sacrifice consistency for availability if needed. Examples include Dynamo, BigTable, Cassandra and CouchDB.
This document provides a summary of best practices for DevOps as outlined by Erik Osterman of Cloud Posse. It discusses practices across organizational structure, software development, infrastructure automation, monitoring and security. Some key best practices include: establishing a makers culture with uninterrupted focus time for developers; using containers for local development environments and tools; strict branch protection and pull requests for code changes; immutable infrastructure with infrastructure as code; actionable alerts and post-mortems for monitoring; and identity-aware access, temporary credentials, and multi-factor authentication for security. The document aims to share proven strategies that help achieve reliability, speed, ease of use and affordability of systems.
Ruby on Rails was presented to the Agile Atlanta group. The presentation provided an overview of Ruby, demonstrated the Rails framework, and described its principles and architecture in 3 sentences or less:
Ruby is an agile language and Ruby on Rails is its popular web application framework that promotes agile practices like convention over configuration and includes everything needed to build database-driven web apps according to the MVC pattern.
The document is a blog post that discusses enabling guided merge functionality in Oracle Customer Hub (Siebel UCM). It provides steps to call a workflow from the "Guided Merge" button, enable merge tasks, publish tasks, add responsibilities for access, and invoke the button. It also discusses adding new fields and deploying integration objects. Limitations are provided that guided merge only supports accounts and contacts.
MongoDB is the coolest NoSQL DB around, partially because it's simple-by-design philosophy. Without transactions or joins, all the bad vibe of SQL is gone.
In this presentation I demonstrate how to get started with MongoDB in the cloud using Mon
Continuous delivery a happier, safer alternative to release trainsThoughtworks
This document discusses principles and practices for continuous delivery including automating the build, deployment, testing and release process. It emphasizes reducing risk through techniques like feature toggles, blue-green deployments, canary releasing and implementing a production immune system. It also stresses the importance of collaboration between developers, testers and operations personnel.
JDD2015: Sustainability Supporting Data Variability: Keeping Core Components ...PROIDEA
SUSTAINABILITY SUPPORTING DATA VARIABILITY: KEEPING CORE COMPONENTS CLEAN WHILE DEALING WITH DATA VARIABILITY
A big challenge in building complex, data-intensive systems is how to sustainably support data variation, schema, and feature evolution. This talk examines strategies, practices, and patterns drawn from real experiences that support new and evolving data-processing requirements while keeping the core architecture clean. As complex systems evolve to meet varying data formats, they can devolve into poorly architected Big Balls of Mud filled with special-case logic and one-off processing. Alternatively, you can isolate core components of your system and protect them from entanglements and unnecessary complexity by designing them to operate on common data formats while providing extension mechanisms that enable processing variations.
Similar to TripCase Unit Testing with Jasmine (20)
JDD2015: Sustainability Supporting Data Variability: Keeping Core Components ...
TripCase Unit Testing with Jasmine
1. TripCase Unit Testing with
Jasmine
Presented by Steve Pond
@stephenpond
Tuesday, December 11, 12
2. Overview
What to Unit Test?
Test Driven Development
Walkthrough of Jasmine Unit Testing and Tools
Walkthrough of JSCover - coverage testing
Q&A
Tuesday, December 11, 12
3. Unit Testing
Repeatable: You can rerun the same test as many times as you
want.
Consistent: Every time you run it, you get the same result. (for
example: Using threads can produce an inconsistent result)
In Memory: It has no “hard” dependencies on anything not in
memory (such as file system, databases, network)
Fast: It should take less than half a second to run a unit test.
Checking one single concern or “use case” in the system: (More
than one can make it harder to understand what or where the
problem is when the problem arises.)
Tuesday, December 11, 12
4. Integration Testing
Use system dependent values that change dynamically (such
as DateTime.Now, or Environment.MachineName)
Create objects of which it has little control (such as threads,
random number generators)
Reach out to external systems or local machine dependencies
(from calling web services to using local configuration files)
Test multiple things in the course of one test case (from
database integrity, to configurations, to protocols, to system
logic, in one go).
Tuesday, December 11, 12
6. TripCase UT Barriers
Framework implements multiple libraries
Inner-team dialogues are generally integration related
Deadline Driven. Zero time.
GreenField - BrownField
Tuesday, December 11, 12
7. Procedure
Determining what is unit-testable
Tuesday, December 11, 12
8. Reflexive
Does its own thing... (extension to our app’s core
logic)
Tuesday, December 11, 12
9. Algorithmic
Our apps consciousness, makes decisions, etc...
Tuesday, December 11, 12
11. Core
Heartbeat
Sets up Require config
app.js
Initializes app modules
Tuesday, December 11, 12
12. Core - Reflexive
Mainly just initialization
Launching the App
Tuesday, December 11, 12
13. Router
History Stack
Navigation API
Map hash change to mediator events & vice versa
Tuesday, December 11, 12
14. Router - Reflexive
Mainly just mapping hash changes to mediator events
API, and history stack, handed to us
Tuesday, December 11, 12
15. Views
Views present model data and respond to client
interactions
Ideally, views just render and invoke actions on the
model
Tuesday, December 11, 12
16. Views - Reflexive
Views merely couple the model and the client
interaction
Up for debate: some success/fail scenarios sometimes
handled in view? Sounds Algorithmic.
Use discretion on Unit Testing
Tuesday, December 11, 12
17. Controllers
Module/Feature level, initializes the workflow or view
Workflow handles app state change, swaps views
Controller listens to mediator events for various action
Listens to view/workflow level events
Tuesday, December 11, 12
18. Controller - Reflexive
Workflows should be kept lean (refer to SOLID
principle) and stick to single responsibility rule
Controllers mainly just mapping the mediator to
workflow or view initializations
In practice, I have seen a lot of app logic handled in
workflows. Unit Test with discretion.
Tuesday, December 11, 12
19. Models
Sync, fetch, and Save
Special parsing
Special validation
Special helpers
Special URL and payload
Tuesday, December 11, 12
20. Models - Algorithmic
Models/ Collections - clear choice for unit test
candidates
We provide a lot of logic for parsing and helpers here
Tuesday, December 11, 12
21. Next Step: Draft our spec
Analyze a story
Pseudo Code
Tuesday, December 11, 12
22. Analyze Story: Share
Itinerary
Contacts Collection
Share contacts helper should return all contacts that are shared
Contacts model
Should properly construct a URL for syncing
Should properly construct a payload for fetching
Should properly construct a payload for saving
Should properly validate user Input
Should properly set attributes for a given response
Tuesday, December 11, 12
24. TDD encourages
simple designs and inspires
confidence.
Ken Beck
who is credited with
having developed or
'rediscovered' the
technique, stated in
Tuesday, December 11, 12
25. A Simple TDD Workflow
1. Write test stubs based on business requirements
for a new feature
2. Write minimal code in Spec to PASS the unit test
3. Tweak code to pass the FUNCTIONAL test
4. Go back and tweak the unit test with new code
and Together until SUCCESS
Tuesday, December 11, 12
26. Group Activity: Analyze a
Story
Given the story of a
Search Hotel Module,
identify the unit-
testable assertions
Apply it to a minimal
Jasmine Spec
Template
Tuesday, December 11, 12