{"id":22213375,"url":"https://github.com/jeffnyman/testable","last_synced_at":"2025-06-21T17:04:03.342Z","repository":{"id":59157545,"uuid":"201559026","full_name":"jeffnyman/testable","owner":"jeffnyman","description":"Web Automation using Watir / Selenium","archived":false,"fork":false,"pushed_at":"2021-05-30T15:16:03.000Z","size":92,"stargazers_count":1,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-05-20T13:48:52.447Z","etag":null,"topics":["selenium","watir","webdriver"],"latest_commit_sha":null,"homepage":"","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jeffnyman.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-08-10T00:39:14.000Z","updated_at":"2022-03-16T18:16:14.000Z","dependencies_parsed_at":"2022-09-13T17:52:19.583Z","dependency_job_id":null,"html_url":"https://github.com/jeffnyman/testable","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/jeffnyman/testable","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jeffnyman%2Ftestable","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jeffnyman%2Ftestable/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jeffnyman%2Ftestable/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jeffnyman%2Ftestable/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jeffnyman","download_url":"https://codeload.github.com/jeffnyman/testable/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jeffnyman%2Ftestable/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":260966327,"owners_count":23090065,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["selenium","watir","webdriver"],"created_at":"2024-12-02T21:09:32.853Z","updated_at":"2025-06-21T17:03:58.324Z","avatar_url":"https://github.com/jeffnyman.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Testable\n\n\u003e **Testable /ˈtestəb(ə)l/**\n\u003e\n\u003e _adjective_\n\u003e\n\u003e _able to be tested or tried._\n\n----\n\n[![Gem Version](https://badge.fury.io/rb/testable.svg)](http://badge.fury.io/rb/testable)\n[![License](http://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/jeffnyman/testable/blob/master/LICENSE.md)\n\n[![Yard Docs](http://img.shields.io/badge/yard-docs-blue.svg)](http://rubydoc.info/github/jeffnyman/testable/master/frames)\n[![Inline docs](http://inch-ci.org/github/jeffnyman/testable.png)](http://inch-ci.org/github/jeffnyman/github)\n\nTestable is an automated test micro-framework that provides a thin wrapper around [Watir](http://watir.com/). Testable is based on many ideas from tools like [SitePrism](https://github.com/natritmeyer/site_prism) and [Watirsome](https://github.com/p0deje/watirsome), while also being a logical evolution of my own tool, [Tapestry](https://github.com/jeffnyman/tapestry).\n\nOne of the core goals of Testable is to be a mediating influence between higher-level tests (acceptance criteria) and lower-level implementations of those tests. You can see some of the design principles for more details on what guided construction.\n\n## Installation\n\nTo get the latest stable release, add this line to your application's Gemfile:\n\n```ruby\ngem 'testable'\n```\n\nTo get the latest code:\n\n```ruby\ngem 'testable', git: 'https://github.com/jeffnyman/testable'\n```\n\nAfter doing one of the above, execute the following command:\n\n    $ bundle\n\nYou can also install Testable just as you would any other gem:\n\n    $ gem install testable\n\n## Usage\n\nProbably the best way to get a feel for the current state of the code is to look at the examples:\n\n* [Testable Info](https://github.com/jeffnyman/testable/blob/master/examples/testable-info.rb)\n* [Testable Basics](https://github.com/jeffnyman/testable/blob/master/examples/testable-watir.rb)\n* [Testable Watir](https://github.com/jeffnyman/testable/blob/master/examples/testable-watir-test.rb)\n* [Testable Context](https://github.com/jeffnyman/testable/blob/master/examples/testable-watir-context.rb)\n* [Ready script](https://github.com/jeffnyman/testable/blob/master/examples/testable-watir-ready.rb)\n* [Events script](https://github.com/jeffnyman/testable/blob/master/examples/testable-watir-events.rb)\n* [Data setter script](https://github.com/jeffnyman/testable/blob/master/examples/testable-watir-datasetter.rb)\n\nYou'll see references to \"Veilus\" and a \"localhost\" in the script. I'm using my own [Veilus application](https://veilus.herokuapp.com/). As far as the localhost, you can use the [Veilus repo](https://github.com/jeffnyman/veilus) to get a local copy to play around with.\n\n## Design Principles\n\nAn automated test framework provides a machine-executable abstraction around testing and encodes a set of guiding principles and heuristics for writing tests-as-code.\n\nOne of the obstacles to covering the gap between principles of testing and the practice of testing is the mechanics of writing tests. These mechanics are focused on abstractions. A lot of the practice of testing comes down to that: finding the right abstractions.\n\nAn automated test framework should be capable of consuming your preferred abstractions because ultimately the automation is simply a tool that supports testing, which means how the framework encourages tests to be expressed should have high fidelity with how human tests would be expressed. The execution of tests, whether automated or not, is often secondary to the design of those tests in the first place. Testable was designed around a couple of truisms:\n\n* When tests become automation:\n  * We risk turning testing into a programming problem.\n\n* When tests become automation:\n  * We risk the mechanisms overwhelming the meaning.\n\nThis is why Testable is designed as a _micro_-framework rather than a framework.\n\nTestable is built around the the idea that automation should largely be small-footprint, low-fiction, and high-yield.\n\nThe code that a test-supporting micro-framework allows should be modular, promoting both high cohesion and low coupling, as well as promoting a single level of abstraction. These concepts together lead to lightweight design as well as support traits that make change affordable for tests.\n\nThat makes the automation code less expensive to maintain and easier to change. That, ultimately, has a positive impact on the cost of change but, more importantly, allows Testable to be fit within a cost of mistake model, where the goal is to get feedback as quickly as possible regarding when mistakes are made.\n\nSome of the core principles of Testable's design are the following:\n\n* Embrace small code.\n* Abstraction encourages clarity.\n* No computation is too small to be put into a helper function.\n* No expression is too simple to be given a name.\n* Small code is more easily seen to be obviously correct.\n* Code that's more obviously correct can be more easily composed.\n\nThe above also led to some secondary, but no less important, principles of design:\n\n* Be willing to trade elegance of design for practicality of implementation.\n* Embrace brevity, but do not sacrifice readability. Concise, not terse.\n* Prefer elegance over efficiency where efficiency is less than critical.\n\n## Development\n\nAfter checking out the repo, run `bin/setup` to install dependencies. Then, run `bundle exec rake spec:all` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.\n\nThe default `rake` command will run all tests as well as a RuboCop analysis.\n\nTo install this gem onto your local machine, run `bundle exec rake install`.\n\n## Contributing\n\nBug reports and pull requests are welcome on GitHub at [https://github.com/jeffnyman/testable](https://github.com/jeffnyman/testable). The testing ecosystem of Ruby is very large and this project is intended to be a welcoming arena for collaboration on yet another test-supporting tool.\n\nEveryone interacting in the Testable project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/jeffnyman/testable/blob/master/CODE_OF_CONDUCT.md).\n\nThe Testable gem follows [semantic versioning](http://semver.org).\n\nTo contribute to Testable:\n\n1. [Fork the project](http://gun.io/blog/how-to-github-fork-branch-and-pull-request/).\n2. Create your feature branch. (`git checkout -b my-new-feature`)\n3. Commit your changes. (`git commit -am 'new feature'`)\n4. Push the branch. (`git push origin my-new-feature`)\n5. Create a new [pull request](https://help.github.com/articles/using-pull-requests).\n\n## Author\n\n* [Jeff Nyman](http://testerstories.com)\n\n## License\n\nTestable is distributed under the [MIT](http://www.opensource.org/licenses/MIT) license.\nSee the [LICENSE](https://github.com/jeffnyman/testable/blob/master/LICENSE.md) file for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjeffnyman%2Ftestable","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjeffnyman%2Ftestable","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjeffnyman%2Ftestable/lists"}