Bozzy
Quality Assurance Presentation
Brought to you by the team
Erica D. | Ian G. | Sophie L.P. | Ted M.
KWRAERBG AO*EUPB SOEUF TED
Stenography—What is it?
Written Shorthand → Machine Shorthand
Type Syllables, Words, Phrases instead of letters
200+ words per minute, fast as you can speak, think.
Less stress, better ergonomics
Open Source ♥︎ Steno
- Steno was traditionally very proprietary
- Hardware, software, and education were very expensive
-
But, wait! Open Steno Project is founded
- Plover, first free steno engine
- Hardware is open and more affordable
- Free educational resources (texts, games)
- Our customer Mirabai Knight, founded the Open Steno Project, and our team member is currently the lead developer of Plover
Stenographic Dictionaries
- Stenographers work with multiple dictionaries
- One large dictionary
- covers English (~150,000 entries)
- oft-called "theory" dictionary
- Several smaller dictionaries
- Personal dictionaries
- Job-specific and specialized dictionaries
- One large dictionary
- Dictionaries have a configurable order
- A dictionary entry consists of machine input to
emulated keyboard output.
Enter… Bozzy
- First free standalone stenographic dictionary editor
- Named, by our customer, after James Boswell, right hand man of Samuel Johnson, who published the first comprehensive English dictionary.
- Make editing stenographic dictionaries easier (vs manual editing)
- Ease the conversion between Plover's JSON and RTF/CRE
- Allow users of stenography systems to edit their dictionaries for free
Objectives
Sample Use Case: Open Dictionary
Sample Use Case: Convert Dictionary
Sample Use Case: Edit & Save
Architecture
- JVM Desktop App, on Windows and OSX
- Model View Controller architectural pattern
-
- UI built using JavaFX and FXML
- Controllers written using Scala
- Data models used to hold dictionaries, user settings, and data in memory, no database
- Use the operating system's native file system
- Read and write dictionary files and user settings files
QA Strategy & Process
- High internal standards
- Unit test all new features
- Mandatory code reviews
- Code style
- Highly engaged customer with personal interest
- Incremental releases
- Reviews against requirements
- Large, willing-to-test community
Test Plan
-
Continuously... (everyone)
-
unit test every feature
- low-level
- black and clear box testing
- code review
- "full-regression" suite, verify all core features still work
- high-level tests
- black box
-
unit test every feature
-
Milestones... (Ted, Sophie)
- basic feature complete (interview with customer)
- first public beta (Obs. session, design review, public feedback)
- release candidate (Obs. session, public feedback)
// You are so jelly of our beautiful test cases.
"The DictionaryEntry class" should "load a simple JSON entry" in {
var entry = new DictionaryEntry("\"KOPB/SREPBGS\": \"convention\",",
DictionaryFormat.JSON, "name")
entry.stroke.raw should equal ("KOPB/SREPBGS")
entry.translation.raw should equal ("convention")
entry = new DictionaryEntry(
"\"TRAOEU/SER/TOPS\": \"Triceratops\",",
DictionaryFormat.JSON,
"name"
)
entry.stroke.raw should equal ("TRAOEU/SER/TOPS")
entry.translation.raw should equal ("Triceratops")
}
Test Environment
Travis CI running tests on every push, building on release
SBT, build tool for Scala & Java applications
Test Data
- The dictionaries to test and verify the system:
- StenEd (RTF)
- Simple theory dictionary in RTF
- Magnum (RTF)
- Complex proprietary dictionary
- Plover Main (JSON)
- GPL theory dictionary, default with Plover
- StenEd (RTF)
- Our tests are based off of data from these dictionaries, as well as custom entries made to test edge cases.
{
"#*E": "{>}{&e}",
"#*EU": "{>}{&i}",
"#*U": "{>}{&u}",
"#-D": "{^ed}",
"#-Z": "00",
"#240": "240",
"#45/TK-PL": "$45",
"#EUD/KWROPL": "idiom",
"#K*": "{>}{&k}",
"#KR*": "{>}{&c}",
"#KW*": "{>}{&q}",
"#KWR*": "{>}{&y}",
"#R*": "{>}{&r}",
"#W*": "{>}{&w}",
"*B": "B",
"*BG": "{^k}",
"*BGS": "action",
"*BS": "action",
"*D": "{^'d}",
"*E": "{>}{&e}",
"*E/KHREUPS": "Eclipse"
}
Core Regression Suite
The aim is to cover all functional requirements
Scripts should be executable manually,
or through automated testing.
Dictionary Management
- Create a blank dictionary ("new")
- Open an existing dictionary
- Define a stroke for "new" dictionary
- Move stroke between dictionaries
- View diff
- Save changes
- Close "new" dictionary
- Reopen "new" dictionary, verify priority
- Reorder "new" and existing dictionary
- Add same-chord stroke to "new" dictionary,
verify that priority is handled.
- 1.4
- 1.1, 1.2, 1.3
- 5.1
- 5.2
- 5.3
- 5.4
- 2.1
- 3.1, 3.3
- 3.2
Searching (Filtering, Sorting)
- Load two dictionaries with data
- One RTF/CRE, one JSON
- Filter dictionaries:
- By Stroke
- By Definition
- By Word Count
- By Dictionary
- By Stroke, Definition, Dictionary
- Sort results by word count
- Clear filter, sort by translation
- FR 1, 4.1
- FR 4.2
- FR 4.3
- FR 4.3
Backup / Conversion
- Load two dictionaries with data
- One RTF/CRE, one JSON
- Add two backup directories
- Run backup
- Convert JSON dictionary to RTF
- Verify unconvertables
- Remove JSON dictionary
- Add new RTF conversion
- Convert new RTF back to JSON
- View diff since backup
- Restore from backup
- FR 1
- 6.2
- 6.1
- 7.2
- 7.3
- 2.1
- FR 1
- 7.1
- 5.3
- 6.3
Merge
- Load two dictionaries with data
- One RTF/CRE, one JSON
- Merge RTF/CRE and JSON dictionary
- Verify unmergeables
- FR 1
- 8.1
- 8.2
Build
- Load Plover `main.json`
- "Build" with text that contains words
not in `main.json` - Verify diff after build task
- FR 1
- 9.2
- 9.3
Conclusion
- Exciting new product type
- Exciting new language for our team
- Easy to test
- Excited customer
- Valuable, frequent feedback
- Open Source means that all is up for scrutiny.
- Test Plan is designed to give us more
information than we need - Reiteration is key
- Without quality, the software is useless
BozzyQuality and Assurance
By Ted Morin
BozzyQuality and Assurance
- 765