...
- Scrum is our common project management method
- Requirements are prioritized and organized into releases
- Releases are planned on a product roadmap
- Release features mapped to Sprints
- Release features defined by epics, stories in BDD format
- Manager controls backlog
- Sprints include: plan, deliver, demo, retrospective
- Standups: daily check: done, doing, blockers
- Reporting on demand via JIRA or equivalent toolset
Create BDD Stories as Test Cases
- Stories are normally defined as acceptance test cases in JIRA
- Define an actor and the test case in Gherkin format normally
- BDD ( Behavior-Driven Design ) test methods have lower semantic gaps
- Common Gherkin keywords:
- As X, Given, When, Then, So
- What are the verifications needed in each step of the story?
...
and customer can receive the goods they paid for
Create Executable Test Cases from BDD Stories for Solution Definition Validation
groovyconsole
cma1_1.groovy
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
//==================================
//x2031 groovy smart objects w expando events
println "//x2031 ex-expando-events-gen-v1.groovy"
println """
ex-expando-events-gen-v1.groovy
x111c groovy bound property example - https://blog.mrhaki.com/2009/08/groovy-goodness-bound-and-constrained.html
shows the flexibility of event messaging in requirements modeling using bound property event listeners
in the example
the toyota vehicle has bound properties
the owner listens for changes in the toyota properties
this model has 2 independent objects, one listening for events on the other in a single Java process
for modeling purposes, this simple method can proxy the concept of independent processes linked by event messages
jim mason - jmason900@yahoo.com
"""
import groovy.beans.*
class Owner implements PropertyChangeListener {
boolean carPriceChange
Car aCar
String name
String toString() {
"owner = $this.name and the car is ${aCar.toString()} "
}
public void propertyChange(PropertyChangeEvent e) {
String propertyName = e.getPropertyName();
println "debug>> e = ${e.toString()}"
if ("price".equals(propertyName)) {
println "\n Event >> Owner $this.name detected car ${e.source.brand} price changed to: ${e.newValue} from: ${e.oldValue} \n\t the car is ${aCar.toString()} \n"
}
if ("automatic".equals(propertyName)) {
println "\n Event >> Owner $this.name detected car ${e.source.brand} automatic transmission type changed to: ${e.newValue} from: ${e.oldValue} \n\t the car is ${aCar.toString()} \n"
}
}
}
@Bindable
class Car {
int numberOfDoors
@Vetoable String model
@Vetoable String brand
@Bindable boolean automatic
@Bindable double price
String toString() {
"[Car details => brand: '${brand}', model: '${model}', #doors: '${numberOfDoors}', automatic: '${automatic}', price: '${price}']"
}
}
import groovy.beans.*
import java.beans.*
def toyota = new Car(brand: 'Toyota', model: 'Verso', price: 28919, numberOfDoors: 5, automatic: false)
toyota.propertyChange = {
if (it.propertyName == 'price') {
println "The price has changed. Inform sales the new price is '${it.newValue}'."
}
}
toyota.vetoableChange = { PropertyChangeEvent pce ->
if (pce.propertyName == "brand") {
if (!(pce.newValue in ['Toyota', 'Lexus'])) {
throw new PropertyVetoException('New value is not Toyota or Lexus', pce)
}
}
if (pce.propertyName == "model") {
if (pce.newValue ==~ /.*\d+.*/) {
throw new PropertyVetoException('No numbers in model names allowed.', pce)
}
}
}
toyota.price = 30995
assert 30995 == toyota.price
toyota.brand = 'Lexus'
assert 'Lexus' == toyota.brand
try {
toyota.brand = 'AUDI'
assert false: 'We should not be able to set this value.'
} catch (PropertyVetoException e) {
assert true
println " could not set brand to AUDI. car brand is ${toyota.brand}"
}
try {
toyota.model = 'A5'
assert false: 'We should not be able to set this value.'
} catch (PropertyVetoException e) {
assert true
println " could not set model to A5. car model is ${toyota.model}"
}
def anOwner = new Owner()
anOwner.name = "Jim"
println anOwner.toString()
anOwner.aCar = toyota
println "\n car was purchased \n ${ anOwner.toString() } \n "
// how to add an propertyChangeListener to an object in groovy
toyota.addPropertyChangeListener(anOwner)
toyota.automatic = true
toyota.price = 44000
toyota.automatic = true // no pce fired because the attribute state is the same
|
Bug Reporting in Jira
Solution Architecture Method - SAM - Sky Web Team
...