fsharp-testing
Implementa testes em F# usando xUnit e outras ferramentas, garantindo a qualidade e robustez do código.
O que ela faz
Esta 'skill' ajuda você a escrever testes para seu código F#. Ela mostra como usar ferramentas populares como xUnit, FsUnit, Unquote e FsCheck para garantir que seu código funcione como esperado.
Quando usar
- ✓Quando você está escrevendo novos testes para seu código F#.
- ✓Ao revisar a qualidade e a cobertura dos testes existentes.
- ✓Para configurar a estrutura de testes em projetos F#.
Exemplo do que pedir para a IA
“Como posso escrever um teste básico para verificar se um pedido é criado com o status 'Pendente' em F#?”
Quer saber mais? Abra as seções abaixo.
Como usar
O jeito mais fácil: copie a mensagem abaixo e cole no Claude, ChatGPT, Cursor ou outra IA. Ela lê a skill e segue as instruções.
Link da skill
Mensagem pronta para colar
Como funciona
A 'skill' usa frameworks de teste como xUnit e bibliotecas como FsUnit e Unquote para definir testes. Para testes mais avançados, ela demonstra o uso de FsCheck para testes baseados em propriedades e NSubstitute para simular dependências.
Instalação
Jeito mais fácil: copie o link da skill e cole no Claude, ChatGPT ou Cursor pedindo para seguir as instruções.
No terminal (Claude Code, Codex, Cursor), na pasta do projeto:
npx skills add affaan-m/ECC --skill fsharp-testingOu baixe só o arquivo:
curl -L https://raw.githubusercontent.com/affaan-m/ECC/main/pi/core/skills/fsharp-testing/SKILL.md -o SKILL.mdConteúdo técnico (SKILL.md)
Tradução do texto original do autor no GitHub. Os comandos e códigos estão como no original.
Padrões de Teste em F#
Padrões abrangentes de teste para aplicações F# usando xUnit, FsUnit, Unquote, FsCheck e práticas modernas de teste do .NET.
Quando Ativar
- Escrevendo novos testes para código F#
- Revisando a qualidade e cobertura dos testes
- Configurando a infraestrutura de testes para projetos F#
- Depurando testes instáveis ou lentos
Pilha de Frameworks de Teste
| Ferramenta | Propósito |
|---|---|
| xUnit | Framework de teste (escolha padrão do ecossistema .NET) |
| FsUnit.xUnit | Sintaxe de asserção amigável para F# para xUnit |
| Unquote | Biblioteca de asserção usando citações F# para mensagens de falha claras |
| FsCheck.xUnit | Teste baseado em propriedades integrado com xUnit |
| NSubstitute | Mocking de dependências .NET |
| Testcontainers | Infraestrutura real em testes de integração |
| WebApplicationFactory | Testes de integração ASP.NET Core |
Testes Unitários com xUnit + FsUnit
Estrutura Básica de Teste
module OrderServiceTests
open Xunit
open FsUnit.Xunit
[<Fact>]
let ``create sets status to Pending`` () =
let order = Order.create "cust-1" [ validItem ]
order.Status |> should equal Pending
[<Fact>]
let ``confirm changes status to Confirmed`` () =
let order = Order.create "cust-1" [ validItem ]
let confirmed = Order.confirm order
confirmed.Status |> should be (ofCase <@ Confirmed @>)
Asserções com Unquote
Unquote usa citações F# para que as mensagens de falha mostrem a expressão completa que falhou, não apenas "esperado X, obtido Y".
module OrderValidationTests
open Xunit
open Swensen.Unquote
[<Fact>]
let ``PlaceOrder returns success when request is valid`` () =
let request = { CustomerId = "cust-123"; Items = [ validItem ] }
let result = OrderService.placeOrder request
test <@ Result.isOk result @>
[<Fact>]
let ``order total sums item prices`` () =
let items = [ { Sku = "A"; Quantity = 2; Price = 10m }
{ Sku = "B"; Quantity = 1; Price = 5m } ]
let total = Order.calculateTotal items
test <@ total = 25m @>
[<Fact>]
let ``validated email rejects empty input`` () =
let result = ValidatedEmail.create ""
test <@ Result.isError result @>
Testes Assíncronos
[<Fact>]
let ``PlaceOrder returns success when request is valid`` () = task {
let deps = createTestDeps ()
let request = { CustomerId = "cust-123"; Items = [ validItem ] }
let! result = OrderService.placeOrder deps request
test <@ Result.isOk result @>
}
[<Fact>]
let ``PlaceOrder returns error when items are empty`` () = task {
let deps = createTestDeps ()
let request = { CustomerId = "cust-123"; Items = [] }
let! result = OrderService.placeOrder deps request
test <@ Result.isError result @>
}
Testes Parametrizados com Theory
[<Theory>]
[<InlineData("")>]
[<InlineData(" ")>]
let ``PlaceOrder rejects empty customer ID`` (customerId: string) =
let request = { CustomerId = customerId; Items = [ validItem ] }
let result = OrderService.placeOrder request
result |> should be (ofCase <@ Error @>)
[<Theory>]
[<InlineData("", false)>]
[<InlineData("a", false)>]
[<InlineData("user@example.com", true)>]
[<InlineData("user+tag@example.co.uk", true)>]
let ``IsValidEmail returns expected result`` (email: string, expected: bool) =
test <@ EmailValidator.isValid email = expected @>
Teste Baseado em Propriedades com FsCheck
Usando FsCheck.xUnit
open FsCheck
open FsCheck.Xunit
[<Property>]
let ``order total is always non-negative`` (items: NonEmptyList<PositiveInt * decimal>) =
let orderItems =
items.Get
|> List.map (fun (qty, price) ->
{ Sku = "SKU"; Quantity = qty.Get; Price = abs price })
let total = Order.calculateTotal orderItems
total >= 0m
[<Property>]
let ``serialization roundtrips`` (order: Order) =
let json = JsonSerializer.Serialize order
let deserialized = JsonSerializer.Deserialize<Order> json
deserialized = order
Geradores Personalizados
type OrderGenerators =
static member ValidEmail () =
gen {
let! user = Gen.elements [ "alice"; "bob"; "carol" ]
let! domain = Gen.elements [ "example.com"; "test.org" ]
return $"{user}@{domain}"
}
|> Arb.fromGen
[<Property(Arbitrary = [| typeof<OrderGenerators> |])>]
let ``valid emails pass validation`` (email: string) =
EmailValidator.isValid email
Mocking de Dependências
Stubs de Função (Preferencial)
…
Perguntas frequentes
O que são testes baseados em propriedades?
São testes que verificam se uma propriedade do seu código se mantém verdadeira para uma variedade de entradas geradas automaticamente, em vez de testar entradas específicas.
O que é 'mocking' ou simulação?
É criar versões falsas de outras partes do seu programa para testar uma parte isoladamente. Por exemplo, simular um banco de dados para testar a lógica de pedidos.
Por que usar Unquote em vez de FsUnit?
Unquote oferece mensagens de erro mais detalhadas quando um teste falha, mostrando exatamente qual parte da expressão causou o problema.
Detalhes
Descrição original do autor
F# testing patterns with xUnit, FsUnit, Unquote, FsCheck property-based testing, integration tests, and test organization best practices. Use when writing F# tests with xUnit, FsUnit, Unquote, or FsCheck.
repo: affaan-m/ECC
Popularidade
- Estrelas no GitHub
- 280 mil
- Posição no ranking
- #59
- Licença
- MIT
- Atualizada em
- 15/10/2026
Comentários
- …
Mais skills deste repositório
accessibility
Ajuda seu agente a criar interfaces que todos possam usar. Garante que sites e aplicativos funcionem bem para pessoas com deficiência, como cegos ou com mobilidade reduzida.
affaan-m/ECC
agent-architecture-audit
Faz seu agente verificar se tudo está funcionando corretamente. Ele encontra e conserta problemas em sistemas de IA, garantindo que funcionem como esperado.
affaan-m/ECC
agent-eval
Ajuda seu agente a comparar diferentes ferramentas de programação de IA. Ele mede qual é mais rápido, barato e confiável para realizar tarefas específicas.
affaan-m/ECC
agent-harness-construction
Faz seu agente entender melhor como realizar tarefas. Ele otimiza as ferramentas e instruções que o agente usa para aumentar suas chances de sucesso.
affaan-m/ECC
Skills parecidas
webapp-testing
Permite testar aplicações web locais, verificar funcionalidades e depurar o comportamento da interface. Captura screenshots e logs do navegador.
anthropics/skills
ponytail-audit
Faz uma auditoria completa do código. Ele encontra bugs, falhas de segurança, código lento e sugere o que remover ou melhorar.
DietrichGebert/ponytail
ponytail-review
Revisa a qualidade de uma mudança no código. Verifica se a lógica está correta, se é segura, rápida e se todas as linhas são necessárias.
DietrichGebert/ponytail