generated from coulomb/repo-seed
chore: Fixed line endings i tutorials and provided Introduction
This commit is contained in:
199
INTRODUCTION.md
Normal file
199
INTRODUCTION.md
Normal file
@@ -0,0 +1,199 @@
|
||||
# 🧪 Introduction to Test-Driven-UI Development
|
||||
|
||||
Here’s an introduction to the **TestDrive-UI development philosophy**.
|
||||
|
||||
It explains *how to develop UI components the TestDrive-UI way*, why each tool is part of the stack, and links directly to their official projects.
|
||||
|
||||
---
|
||||
|
||||
### “Design the test first — let the interface emerge”
|
||||
|
||||
---
|
||||
|
||||
## 🎯 What is TestDrive-UI?
|
||||
|
||||
**TestDrive-UI** is a lightweight, browser-first development scaffold for building interactive web components using a **Test-Driven Development (TDD)** workflow.
|
||||
|
||||
It provides a reproducible structure that’s simple enough for hobby projects, but robust enough for AI-assisted, agent-driven development loops.
|
||||
|
||||
> **Core idea:**
|
||||
> Every UI feature begins as a **behavioral test** — not a design or mockup.
|
||||
> The implementation grows only to satisfy that test.
|
||||
> The UI emerges naturally from verified expectations.
|
||||
|
||||
---
|
||||
|
||||
## 🧱 The Toolchain Overview
|
||||
|
||||
| Tool | Purpose | Why it’s used | Website |
|
||||
| -------------------------------------------------------- | ------------------------------------------------ | ----------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------- |
|
||||
| 🧩 **[Lit](https://lit.dev/)** | Define Web Components with declarative rendering | Fast, framework-agnostic, minimal build overhead; lets you create reusable, encapsulated components | [https://lit.dev](https://lit.dev) |
|
||||
| 🧪 **[Mocha](https://mochajs.org/)** | Test runner for JavaScript | Mature, flexible, CLI-friendly — ideal for writing descriptive, behavior-oriented tests (`describe` / `it`) | [https://mochajs.org](https://mochajs.org) |
|
||||
| 💬 **[Chai](https://www.chaijs.com/)** | Assertion library | Clean, readable syntax for expectations (`expect(value).to.equal(...)`) | [https://www.chaijs.com](https://www.chaijs.com) |
|
||||
| 🧠 **[JSDOM](https://github.com/jsdom/jsdom)** | Simulated DOM for Node | Lets you run DOM-based UI tests without a browser; deterministic and CI-friendly | [https://github.com/jsdom/jsdom](https://github.com/jsdom/jsdom) |
|
||||
| ⚡ **[Vite](https://vitejs.dev/)** | Development server & bundler | Instant hot-reloads and minimal config for web-component projects | [https://vitejs.dev](https://vitejs.dev) |
|
||||
| 🧱 **[Storybook](https://storybook.js.org/)** (optional) | Visual component sandbox | Lets you document, preview, and visually test each component in isolation | [https://storybook.js.org](https://storybook.js.org) |
|
||||
| 🔬 **[Playwright](https://playwright.dev/)** (optional) | End-to-end browser testing | Adds full browser automation for real UI validation | [https://playwright.dev](https://playwright.dev) |
|
||||
|
||||
Together, these tools form the **TestDrive-UI loop**:
|
||||
|
||||
```
|
||||
Requirement → Test (Mocha+Chai) → Implementation (Lit) → Run (Vite) → Refine → Repeat
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🧩 How the Development Flow Works
|
||||
|
||||
### 1. Define the Behavior
|
||||
|
||||
Write a short **requirement statement** or JSON spec describing what the component *should do* — not how it looks.
|
||||
|
||||
Example:
|
||||
|
||||
> “When the user types in the input field, the greeting updates immediately.”
|
||||
|
||||
This requirement drives both test and implementation.
|
||||
|
||||
---
|
||||
|
||||
### 2. Write the Test First
|
||||
|
||||
Create a Mocha test file in `src/components/<component-name>/<component>.test.js`:
|
||||
|
||||
```javascript
|
||||
import "./hello-world.js";
|
||||
|
||||
describe("<hello-world>", () => {
|
||||
it("updates the greeting when user types", async () => {
|
||||
const el = document.createElement("hello-world");
|
||||
document.body.appendChild(el);
|
||||
const input = el.shadowRoot.querySelector("input");
|
||||
input.value = "Agent";
|
||||
input.dispatchEvent(new Event("input"));
|
||||
await el.updateComplete;
|
||||
const greeting = el.shadowRoot.querySelector(".greeting");
|
||||
expect(greeting.textContent.trim()).to.equal("Hello, Agent!");
|
||||
});
|
||||
});
|
||||
```
|
||||
|
||||
When you run `npm test`, this test will **fail** until you implement the behavior.
|
||||
|
||||
---
|
||||
|
||||
### 3. Implement Just Enough Code to Pass
|
||||
|
||||
Write the smallest possible component in **Lit** to satisfy the test:
|
||||
|
||||
```javascript
|
||||
import { LitElement, html, css } from "lit";
|
||||
|
||||
export class HelloWorld extends LitElement {
|
||||
static properties = { name: { type: String } };
|
||||
constructor() { super(); this.name = "World"; }
|
||||
|
||||
render() {
|
||||
return html`
|
||||
<div class="greeting">Hello, ${this.name}!</div>
|
||||
<input type="text" .value=${this.name} @input=${this._onInput} />
|
||||
`;
|
||||
}
|
||||
_onInput(e) { this.name = e.target.value; }
|
||||
}
|
||||
customElements.define("hello-world", HelloWorld);
|
||||
```
|
||||
|
||||
Run tests again — they should now pass.
|
||||
|
||||
---
|
||||
|
||||
### 4. Refine, Extend, and Visualize
|
||||
|
||||
When a component works, visualize it:
|
||||
|
||||
```bash
|
||||
npm run dev
|
||||
```
|
||||
|
||||
Vite opens the browser instantly so you can adjust styling and layout.
|
||||
|
||||
Optionally, use Storybook to display multiple variants:
|
||||
|
||||
```javascript
|
||||
export default { title: "UI/Hello World" };
|
||||
export const Default = () => `<hello-world></hello-world>`;
|
||||
export const Named = () => `<hello-world name="Coulomb"></hello-world>`;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 5. Iterate
|
||||
|
||||
Each new behavior (feature, bugfix, style rule, accessibility improvement) starts with a **new test**.
|
||||
The system evolves incrementally, each step verifiable by automation.
|
||||
|
||||
---
|
||||
|
||||
## 🧠 Why This Matters
|
||||
|
||||
| Principle | Benefit |
|
||||
| ----------------------------------------- | ------------------------------------------------ |
|
||||
| **TDD-first** | Prevents UI drift and regression early. |
|
||||
| **Declarative UI (Lit)** | Clean separation of state and template. |
|
||||
| **Deterministic Testing (JSDOM + Mocha)** | Reproducible results without browser complexity. |
|
||||
| **Fast Iteration (Vite)** | Keeps flow tight and interactive. |
|
||||
| **Optional Visual Layer (Storybook)** | Communication and design documentation built in. |
|
||||
|
||||
---
|
||||
|
||||
## 🧩 Advanced Extensions
|
||||
|
||||
Once the base workflow feels solid, TestDrive-UI scales elegantly to more advanced cases:
|
||||
|
||||
* **Shared reactive stores** — implement central state management (see Tutorial 6).
|
||||
* **Persistence** — save data using localStorage or IndexedDB (see Tutorial 7).
|
||||
* **Agent automation** — use AI coding agents to generate and maintain tests automatically (see Tutorial 8).
|
||||
* **End-to-end testing** — run full browser simulations via Playwright.
|
||||
|
||||
---
|
||||
|
||||
## 🔗 Official Tool Links
|
||||
|
||||
| Tool | Website |
|
||||
| ---------- | ---------------------------------------------------------------- |
|
||||
| Lit | [https://lit.dev](https://lit.dev) |
|
||||
| Mocha | [https://mochajs.org](https://mochajs.org) |
|
||||
| Chai | [https://www.chaijs.com](https://www.chaijs.com) |
|
||||
| JSDOM | [https://github.com/jsdom/jsdom](https://github.com/jsdom/jsdom) |
|
||||
| Vite | [https://vitejs.dev](https://vitejs.dev) |
|
||||
| Storybook | [https://storybook.js.org](https://storybook.js.org) |
|
||||
| Playwright | [https://playwright.dev](https://playwright.dev) |
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Quick Start Recap
|
||||
|
||||
```bash
|
||||
# Clone or unzip scaffold
|
||||
npm install
|
||||
|
||||
# Run tests
|
||||
npm test
|
||||
|
||||
# Start live preview
|
||||
npm run dev
|
||||
```
|
||||
|
||||
* Tests define behavior.
|
||||
* Components evolve from tests.
|
||||
* UIs emerge naturally from verified code.
|
||||
|
||||
> **TestDrive-UI** isn’t a framework — it’s a *method*.
|
||||
> It’s how you and your coding agents learn to reason about interfaces through evidence.
|
||||
|
||||
---
|
||||
|
||||
Start with our tutorials to get going.
|
||||
|
||||
xxx
|
||||
Reference in New Issue
Block a user