diff --git a/snok_test.go b/snok_test.go
index c756f96e83ab169f31c2f39d07ff6c448fb58974..400c0892684ff9c898816faebc7f3e5ef47aa5cf 100644
--- a/snok_test.go
+++ b/snok_test.go
@@ -44,6 +44,9 @@ func TestCmds(t *testing.T) {
 		testcontainers.Logger = log.New(os.Stdout, "  ", 0)
 	}
 	suite.Run(t)
+	if suite.GetLogLevel() >= DebugLevel {
+		t.Log(suite.Graph)
+	}
 }
 
 func mockContainer(s *TestSuite, t *testing.T, args []string) {
diff --git a/test_graph.go b/test_graph.go
index 68010b5973821e24ceebbaa74adbe322bb24f7e5..005a4f30907bb0b7398167d799e73258ca9d3d98 100644
--- a/test_graph.go
+++ b/test_graph.go
@@ -20,6 +20,10 @@ func NewTestGraph() *TestGraph {
 	return &TestGraph{simple.NewDirectedGraph()}
 }
 
+func (g *TestGraph) String() string {
+	return g.Dot()
+}
+
 func (g *TestGraph) AddJob(job graph.Node) {
 	g.Graph.AddNode(job)
 }
@@ -86,3 +90,14 @@ func (g *TestGraph) ResolveDeps() error {
 func (g *TestGraph) SortJobs() ([]graph.Node, error) {
 	return topo.Sort(g.Graph)
 }
+
+func (g *TestGraph) Dot() string {
+	dot := "digraph G {\n"
+	for _, node := range graph.NodesOf(g.Graph.Nodes()) {
+		dot = dot + fmt.Sprintf("  %q;\n", node)
+	}
+	for _, edge := range graph.EdgesOf(g.Graph.Edges()) {
+		dot = dot + fmt.Sprintf("  %q -> %q;\n", edge.From(), edge.To())
+	}
+	return dot + "}\n"
+}
diff --git a/test_suite.go b/test_suite.go
index c41bd9ce4a8c90eb2ed89a9c73ff28dd951fc3d1..0e5fa88d1993d8e5259dd48f0341997ed935fe0d 100644
--- a/test_suite.go
+++ b/test_suite.go
@@ -25,6 +25,7 @@ type TestSuite struct {
 	RootCmd       *cobra.Command
 	LogLevel      LogLevel
 	Graph         *TestGraph
+	dotFile       string
 	unexpectedErr func(require.TestingT, error, ...interface{})
 }
 
@@ -38,6 +39,7 @@ func NewTestSuite(cmd *cobra.Command) *TestSuite {
 	}
 	var l string
 	flag.StringVar(&l, "l", "info", "Log level (error, warn, info, debug, trace)")
+	flag.StringVar(&s.dotFile, "dot", "", "Output dot file")
 	flag.Parse()
 	if os.Getenv("SNOK_LOG_LEVEL") != "" {
 		l = os.Getenv("SNOK_LOG_LEVEL")
@@ -115,6 +117,18 @@ func (s *TestSuite) Run(t *testing.T) {
 	s.addTests(t, s.RootCmd, []string{})
 	err := s.Graph.ResolveDeps()
 	require.NoError(t, err)
+	if s.dotFile != "" {
+		f, err := os.Create(s.dotFile)
+		require.NoError(t, err)
+		n, err := f.WriteString(s.Graph.Dot())
+		require.NoError(t, err)
+		t.Logf("Wrote %d bytes to %s", n, s.dotFile)
+	} else {
+		s.runTests(t)
+	}
+}
+
+func (s *TestSuite) runTests(t *testing.T) {
 	jobs, err := s.Graph.SortJobs()
 	require.NoError(t, err)
 	for _, job := range jobs {