{"id":50515266,"url":"https://github.com/helvecioneto/tqs-2026","last_synced_at":"2026-06-02T23:30:41.372Z","repository":{"id":359816872,"uuid":"1247604228","full_name":"helvecioneto/tqs-2026","owner":"helvecioneto","description":null,"archived":false,"fork":false,"pushed_at":"2026-06-01T11:52:09.000Z","size":78,"stargazers_count":17,"open_issues_count":22,"forks_count":25,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-01T13:24:32.415Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://helvecioneto.github.io/tqs-2026/","language":"Python","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/helvecioneto.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-23T14:37:18.000Z","updated_at":"2026-06-01T11:52:14.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/helvecioneto/tqs-2026","commit_stats":null,"previous_names":["helvecioneto/tqs-2026"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/helvecioneto/tqs-2026","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/helvecioneto%2Ftqs-2026","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/helvecioneto%2Ftqs-2026/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/helvecioneto%2Ftqs-2026/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/helvecioneto%2Ftqs-2026/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/helvecioneto","download_url":"https://codeload.github.com/helvecioneto/tqs-2026/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/helvecioneto%2Ftqs-2026/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33841995,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-02T02:00:07.132Z","response_time":109,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":[],"created_at":"2026-06-02T23:30:37.086Z","updated_at":"2026-06-02T23:30:41.352Z","avatar_url":"https://github.com/helvecioneto.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# TQS 2026 — Projeto-exemplo de Teste e Qualidade de Software\n\n\u003e Material didático da disciplina **Teste e Qualidade de Software (PC010027)** — graduação, Universidade Federal do Oeste do Pará (UFOPA).\n\u003e Prof. **Helvecio Bezerra Leal Neto** · 2026\n\nEste repositório é um **livro prático em capítulos**. Construímos juntos uma pequena aplicação web (um validador de CPF e e-mail) e usamos cada etapa para demonstrar um conceito da disciplina: testes automatizados, TDD, qualidade de código, CI/CD, deploy automatizado e workflow de Pull Requests.\n\nA ideia é que você **leia e execute cada capítulo em ordem**, terminando com um projeto completo que você reproduziu do zero.\n\n🌐 **Demo público**: `https://\u003cseu-usuario\u003e.github.io/tqs-2026/`\n\n---\n\n## 📖 Sumário do livro\n\n| # | Capítulo | O que você aprende |\n|---|---|---|\n| 1 | [Visão geral](capitulos/01-visao-geral.md) | Sobre a aplicação, decisões arquiteturais, stack |\n| 2 | [Preparando o ambiente](capitulos/02-preparando-ambiente.md) | Pré-requisitos (Git, Python, IDE), criar repo, venv |\n| 3 | [Rodando a aplicação](capitulos/03-rodando-aplicacao.md) | Subir o Flask local, testar manualmente, entender o fluxo |\n| 4 | [Testes automatizados](capitulos/04-testes-automatizados.md) | Unitários vs integração, pytest, cobertura, `parametrize` |\n| 5 | [TDD na prática](capitulos/05-tdd-na-pratica.md) | Ciclo Red→Green→Refactor, walkthrough completo |\n| 6 | [Qualidade de código](capitulos/06-qualidade-de-codigo.md) | ruff (lint+format), bandit (segurança), cobertura como portão |\n| 7 | [CI com GitHub Actions](capitulos/07-ci-github-actions.md) | Pipeline `ci.yml` linha-a-linha, lendo logs de falha |\n| 8 | [Deploy automatizado](capitulos/08-deploy-automatizado.md) | GitHub Pages, workflow `deploy.yml`, configuração inicial |\n| 9 | [Pull Requests](capitulos/09-pull-requests.md) | Fluxo de PR, branch protection, code review, CODEOWNERS |\n| 10 | [Atividade prática](capitulos/10-atividade-pratica.md) | 5 tarefas hands-on (CNPJ via TDD, quebrar o CI, etc.) |\n| 11 | [Recursos \u0026 Licença](capitulos/11-recursos-e-licenca.md) | Documentação, bibliografia, para ir além |\n\n\u003e 💡 Cada capítulo tem navegação **anterior ↔ próximo**, então você pode lê-los de ponta a ponta como um livro.\n\n---\n\n## ⚡ Quick start (GitHub Codespaces)\n\nEsta disciplina usa **GitHub Codespaces** como ambiente único — zero instalação, tudo no navegador. O [capítulo 2](capitulos/02-preparando-ambiente.md) cobre o setup em detalhes.\n\n1. **Fork** este repositório (ou crie o seu seguindo o capítulo 2).\n2. No seu repo, clique em **Code** → aba **Codespaces** → **Create codespace on main**.\n3. Aguarde ~1 minuto. O VS Code abre no navegador com tudo instalado (Python 3.11, dependências, extensões).\n4. No terminal do Codespace:\n\n```bash\npytest                              # 6 testes, 82% cobertura\nflask --app src.app run             # porta 5000 será exposta automaticamente\n```\n\n\u003e Trabalhar localmente (com Python instalado) ou pelo github.dev (navegador sem terminal) também funciona, mas não vamos cobrir — padronizamos em Codespaces.\n\n### Verificações que o CI roda (antes de cada commit)\n\n```bash\nruff check . \u0026\u0026 ruff format --check .\nbandit -r src/\npytest --cov=src --cov-fail-under=80\n```\n\n---\n\n## 🗂️ Estrutura do repositório\n\n```\ntqs-2026/\n├── .devcontainer/\n│   └── devcontainer.json           # config GitHub Codespaces\n├── .github/\n│   ├── workflows/\n│   │   ├── ci.yml                  # lint + testes + cobertura\n│   │   └── deploy.yml              # deploy GitHub Pages\n│   ├── ISSUE_TEMPLATE/             # templates de issue\n│   ├── pull_request_template.md    # checklist obrigatório de PRs\n│   └── CODEOWNERS                  # quem revisa o quê\n├── capitulos/                      # 📖 ESTE LIVRO (11 capítulos)\n├── src/\n│   ├── validators.py               # ⭐ VERSÃO PRINCIPAL da lógica\n│   ├── app.py                      # rotas Flask\n│   └── templates/index.html        # formulário (Flask)\n├── tests/\n│   ├── test_validators.py          # 4 testes unitários\n│   └── test_app.py                 # 2 testes de integração\n├── docs/                           # publicado no GitHub Pages\n│   ├── index.html\n│   ├── validators.js               # espelho JS de validators.py\n│   └── style.css\n├── pyproject.toml                  # config ruff + pytest + coverage\n├── requirements.txt                # Flask\n├── requirements-dev.txt            # pytest, ruff, bandit\n├── LICENSE                         # MIT\n└── README.md                       # você está aqui\n```\n\n---\n\n## 🎯 Status atual\n\n| Métrica | Valor |\n|---|---|\n| Testes | **6 passando** (4 unitários + 2 integração) |\n| Cobertura | **82%** (piso do CI: 80%) |\n| Lint | ✅ ruff sem warnings |\n| Segurança | ✅ bandit sem issues |\n\n\u003e Por que só 6 testes? A suíte é proposital­mente enxuta — o objetivo é que você **leia, entenda e expanda**. A [atividade prática](capitulos/10-atividade-pratica.md) pede para você adicionar testes de casos de borda (todos dígitos iguais, tamanho errado, etc.) usando TDD.\n\n---\n\n## 📜 Licença\n\n[MIT](LICENSE) — use, modifique e distribua livremente, inclusive em sala de aula.\n\n---\n\n**Comece a leitura** → [Capítulo 1 — Visão geral ➡](capitulos/01-visao-geral.md)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhelvecioneto%2Ftqs-2026","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhelvecioneto%2Ftqs-2026","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhelvecioneto%2Ftqs-2026/lists"}