Top AI Repos — open-source AI, indexed and scored
Top AI Repos tracks AI repositories on GitHub and answers two different questions about each one: is it moving right now, and would you bet a product on it.
Top AI Repos tracks AI repositories on GitHub and answers two different questions about each one: is it moving right now, and would you bet a product on it.
A Modern Testing Framework for Go
| Date | Stars |
|---|---|
| 2026-07-24 | 9033 |
| 2026-07-25 | 9033 |
| 2026-07-28 | 9033 |
| 2026-07-30 | 9033 |
| 2026-08-07 | 9038 |
| 2026-08-16 | 9042 |
| 2026-08-18 | 9040 |
| 2026-08-21 | 9041 |
| 2026-08-23 | 9042 |
| 2026-08-24 | 9042 |
| 2026-08-25 | 9043 |
| 2026-08-29 | 9044 |
| 2026-08-30 | 9043 |
| 2026-08-31 | 9045 |
| 2026-09-01 | 9045 |
| 2026-09-02 | 9048 |
| 2026-09-03 | 9050 |
| 2026-09-04 | 9051 |
| 2026-09-06 | 9051 |
| 2026-09-07 | 9051 |
| 2026-09-09 | 9051 |
| 2026-09-10 | 9050 |
| 2026-09-11 | 9050 |
| 2026-09-12 | 9051 |
| 2026-09-15 | 9052 |
| 2026-09-16 | 9051 |
| 2026-09-17 | 9053 |
| 2026-09-19 | 9054 |
| 2026-09-20 | 9053 |
Today
-1 stars today
This week
+2 stars this week
This month
+12 stars this month
Momentum
37.0
growth rate 0.02%/day
<picture>
<source media="(prefers-color-scheme: dark)" srcset="docs/images/ginkgo-dark.png">
<img alt="Ginkgo" src="docs/images/ginkgo.png">
</picture>
[](https://github.com/onsi/ginkgo/actions/workflows/test.yml?query=branch%3Amaster) [](https://onsi.github.io/ginkgo/) [](https://github.com/sponsors/onsi)
---
# Ginkgo
Ginkgo is a mature testing framework for Go designed to help you write expressive specs. Ginkgo builds on top of Go's `testing` foundation and is complemented by the [Gomega](https://github.com/onsi/gomega) matcher library. Together, Ginkgo and Gomega let you express the intent behind your specs clearly:
```go
import (
. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
...
)
var _ = Describe("Checking books out of the library", Label("library"), func() {
var library *libraries.Library
var book *books.Book
var valjean *users.User
BeforeEach(func() {
library = libraries.NewClient()
book = &books.Book{
Title: "Les Miserables",
Author: "Victor Hugo",
}
valjean = users.NewUser("Jean Valjean")
})
When("the library has the book in question", func() {
BeforeEach(func(ctx SpecContext) {
Expect(library.Store(ctx, book)).To(Succeed())
})
Context("and the book is available", func() {
It("lends it to the reader", func(ctx SpecContext) {
Expect(valjean.Checkout(ctx, library, "Les Miserables")).To(Succeed())
Expect(valjean.Books()).To(ContainElement(book))
Expect(library.UserWithBook(ctx, book)).To(Equal(valjean))
}, SpecTimeout(time.Second * 5))
})
Context("but the book has already been checked out", func() {
var javert *users.User
BeforeEach(func(ctx SpecContext) {
javert = users.NewUser("Javert")
Expect(javert.Checkout(ctx, library, "Les Miserables")).To(Succeed())
})
It("tells the user", func(ctx SpecContext) {
err := valjean.Checkout(ctx, library, "Les Miserables")
Expect(err).To(MatchError("Les Miserables is currently checked out"))
}, SpecTimeout(time.Second * 5))
It("lets the user place a hold and get notified later", func(ctx SpecContext) {
Expect(valjean.Hold(ctx, library, "Les Miserables")).To(Succeed())
Expect(valjean.Holds(ctx)).To(ContainElement(book))
By("when Javert returns the book")
Expect(javert.Return(ctx, library, book)).To(Succeed())
By("it eventually informs Valjean")
notification := "Les Miserables is ready for pick up"
Eventually(ctx, valjean.Notifications).Should(ContainElement(notification))
Expect(valjean.Checkout(ctx, library, "Les Miserables")).To(Succeed())
Expect(valjean.Books(ctx)).To(ContainElement(book))
Expect(valjean.Holds(ctx)).To(BeEmpty())
}, SpecTimeout(time.Second * 10))
})
})
When("the library does not have the book in question", func() {
It("tells the reader the book is unavailable", func(ctx SpecContext) {
err := valjean.Checkout(ctx, library, "Les Miserables")
Expect(err).To(MatchError("Les Miserables is not in the library catalog"))
}, SpecTimeout(time.Second * 5))
})
})
```
Jump to the [docs](https://onsi.github.io/ginkgo/) to learn more. It's easy to [bootstrap](https://onsi.github.io/ginkgo/#bootstrapping-a-suite) and start writing your [first specs](https://onsi.github.io/ginkgo/#adding-specs-to-a-suite).
If you have a question, comment, bug report, feature request, etc. please open a [GitHub issueExcerpt of 8,893 characters
Read on GitHub535
121
41
William Martin · Netherlands
23
15
13
Tim Jarratt · Maersk · France
11
Renato Monteiro
10
9
8
8
Daniel Lipovetsky · United States
8
7
7
7
Sho Iizuka · Japan
6
6
Kir Kolyshkin · Red Hat · United States
5
Christian Muehlhaeuser
5
4
Would you bet a product on this? Bounded 0–100 and slow moving.
matched fp:748419d91287b1df, topic:testing