diff --git a/internal/lsp/regtest/definition_test.go b/internal/lsp/regtest/definition_test.go
index 09084ac..9f175b5 100644
--- a/internal/lsp/regtest/definition_test.go
+++ b/internal/lsp/regtest/definition_test.go
@@ -5,7 +5,6 @@
 package regtest
 
 import (
-	"context"
 	"path"
 	"testing"
 )
@@ -30,7 +29,7 @@
 `
 
 func TestGoToInternalDefinition(t *testing.T) {
-	runner.Run(t, internalDefinition, func(ctx context.Context, t *testing.T, env *Env) {
+	runner.Run(t, internalDefinition, func(env *Env) {
 		env.OpenFile("main.go")
 		name, pos := env.GoToDefinition("main.go", env.RegexpSearch("main.go", "message"))
 		if want := "const.go"; name != want {
@@ -60,7 +59,7 @@
 }`
 
 func TestGoToStdlibDefinition(t *testing.T) {
-	runner.Run(t, stdlibDefinition, func(ctx context.Context, t *testing.T, env *Env) {
+	runner.Run(t, stdlibDefinition, func(env *Env) {
 		env.OpenFile("main.go")
 		name, pos := env.GoToDefinition("main.go", env.RegexpSearch("main.go", "Now"))
 		if got, want := path.Base(name), "time.go"; got != want {
diff --git a/internal/lsp/regtest/diagnostics_test.go b/internal/lsp/regtest/diagnostics_test.go
index 48a3fdc..609b375 100644
--- a/internal/lsp/regtest/diagnostics_test.go
+++ b/internal/lsp/regtest/diagnostics_test.go
@@ -5,7 +5,6 @@
 package regtest
 
 import (
-	"context"
 	"testing"
 )
 
@@ -24,7 +23,7 @@
 }`
 
 func TestDiagnosticErrorInEditedFile(t *testing.T) {
-	runner.Run(t, exampleProgram, func(ctx context.Context, t *testing.T, env *Env) {
+	runner.Run(t, exampleProgram, func(env *Env) {
 		// Deleting the 'n' at the end of Println should generate a single error
 		// diagnostic.
 		env.OpenFile("main.go")
@@ -43,7 +42,7 @@
 func TestMissingImportDiagsClearOnFirstFile(t *testing.T) {
 	t.Skip("skipping due to golang.org/issues/37195")
 	t.Parallel()
-	runner.Run(t, onlyMod, func(ctx context.Context, t *testing.T, env *Env) {
+	runner.Run(t, onlyMod, func(env *Env) {
 		env.CreateBuffer("main.go", "package main\n\nfunc m() {\nlog.Println()\n}")
 		env.SaveBuffer("main.go")
 		// TODO: this shouldn't actually happen
@@ -57,7 +56,7 @@
 `
 
 func TestDiagnosticErrorInNewFile(t *testing.T) {
-	runner.Run(t, brokenFile, func(ctx context.Context, t *testing.T, env *Env) {
+	runner.Run(t, brokenFile, func(env *Env) {
 		env.CreateBuffer("broken.go", brokenFile)
 		env.Await(env.DiagnosticAtRegexp("broken.go", "\"abc"))
 	})
@@ -80,7 +79,7 @@
 `
 
 func TestDiagnosticClearingOnEdit(t *testing.T) {
-	runner.Run(t, badPackage, func(ctx context.Context, t *testing.T, env *Env) {
+	runner.Run(t, badPackage, func(env *Env) {
 		env.OpenFile("b.go")
 		env.Await(env.DiagnosticAtRegexp("a.go", "a = 1"), env.DiagnosticAtRegexp("b.go", "a = 2"))
 
@@ -91,7 +90,7 @@
 }
 
 func TestDiagnosticClearingOnDelete(t *testing.T) {
-	runner.Run(t, badPackage, func(ctx context.Context, t *testing.T, env *Env) {
+	runner.Run(t, badPackage, func(env *Env) {
 		env.OpenFile("a.go")
 		env.Await(env.DiagnosticAtRegexp("a.go", "a = 1"), env.DiagnosticAtRegexp("b.go", "a = 2"))
 		env.RemoveFileFromWorkspace("b.go")
@@ -101,7 +100,7 @@
 }
 
 func TestDiagnosticClearingOnClose(t *testing.T) {
-	runner.Run(t, badPackage, func(ctx context.Context, t *testing.T, env *Env) {
+	runner.Run(t, badPackage, func(env *Env) {
 		env.CreateBuffer("c.go", `package consts
 
 const a = 3`)
diff --git a/internal/lsp/regtest/env.go b/internal/lsp/regtest/env.go
index 8ba39f9..2b372c0 100644
--- a/internal/lsp/regtest/env.go
+++ b/internal/lsp/regtest/env.go
@@ -141,13 +141,13 @@
 // Run executes the test function in the default configured gopls execution
 // modes. For each a test run, a new workspace is created containing the
 // un-txtared files specified by filedata.
-func (r *Runner) Run(t *testing.T, filedata string, test func(context.Context, *testing.T, *Env)) {
+func (r *Runner) Run(t *testing.T, filedata string, test func(e *Env)) {
 	t.Helper()
 	r.RunInMode(r.defaultModes, t, filedata, test)
 }
 
 // RunInMode runs the test in the execution modes specified by the modes bitmask.
-func (r *Runner) RunInMode(modes EnvMode, t *testing.T, filedata string, test func(ctx context.Context, t *testing.T, e *Env)) {
+func (r *Runner) RunInMode(modes EnvMode, t *testing.T, filedata string, test func(e *Env)) {
 	t.Helper()
 	tests := []struct {
 		name         string
@@ -182,7 +182,7 @@
 					panic(err)
 				}
 			}()
-			test(ctx, t, env)
+			test(env)
 		})
 	}
 }
@@ -230,8 +230,8 @@
 // on any error, so that tests for the happy path may be written without
 // checking errors.
 type Env struct {
-	t   *testing.T
-	ctx context.Context
+	T   *testing.T
+	Ctx context.Context
 
 	// Most tests should not need to access the workspace, editor, server, or
 	// connection, but they are available if needed.
@@ -266,8 +266,8 @@
 		t.Fatal(err)
 	}
 	env := &Env{
-		t:               t,
-		ctx:             ctx,
+		T:               t,
+		Ctx:             ctx,
 		W:               ws,
 		E:               editor,
 		Server:          ts,
@@ -362,7 +362,7 @@
 	// require careful checking of conditions around every state change, so for
 	// now we just limit the scope to diagnostic conditions.
 
-	e.t.Helper()
+	e.T.Helper()
 	e.mu.Lock()
 	// Before adding the waiter, we check if the condition is currently met to
 	// avoid a race where the condition was realized before Await was called.
@@ -379,7 +379,7 @@
 	e.mu.Unlock()
 
 	select {
-	case <-e.ctx.Done():
+	case <-e.Ctx.Done():
 		// Debugging an unmet expectation can be tricky, so we put some effort into
 		// nicely formatting the failure.
 		var descs []string
@@ -389,7 +389,7 @@
 		e.mu.Lock()
 		diagString := formatDiagnostics(e.lastDiagnostics)
 		e.mu.Unlock()
-		e.t.Fatalf("waiting on [%s]:\nerr:%v\ndiagnostics:\n%s", strings.Join(descs, ", "), e.ctx.Err(), diagString)
+		e.T.Fatalf("waiting on [%s]:\nerr:%v\ndiagnostics:\n%s", strings.Join(descs, ", "), e.Ctx.Err(), diagString)
 	case <-met:
 	}
 }
diff --git a/internal/lsp/regtest/formatting_test.go b/internal/lsp/regtest/formatting_test.go
index d1b43bb..202f4d4 100644
--- a/internal/lsp/regtest/formatting_test.go
+++ b/internal/lsp/regtest/formatting_test.go
@@ -1,7 +1,6 @@
 package regtest
 
 import (
-	"context"
 	"testing"
 )
 
@@ -23,7 +22,7 @@
 `
 
 func TestFormatting(t *testing.T) {
-	runner.Run(t, unformattedProgram, func(ctx context.Context, t *testing.T, env *Env) {
+	runner.Run(t, unformattedProgram, func(env *Env) {
 		env.OpenFile("main.go")
 		env.FormatBuffer("main.go")
 		got := env.E.BufferText("main.go")
@@ -69,7 +68,7 @@
 `
 
 func TestOrganizeImports(t *testing.T) {
-	runner.Run(t, disorganizedProgram, func(ctx context.Context, t *testing.T, env *Env) {
+	runner.Run(t, disorganizedProgram, func(env *Env) {
 		env.OpenFile("main.go")
 		env.OrganizeImports("main.go")
 		got := env.E.BufferText("main.go")
@@ -81,7 +80,7 @@
 }
 
 func TestFormattingOnSave(t *testing.T) {
-	runner.Run(t, disorganizedProgram, func(ctx context.Context, t *testing.T, env *Env) {
+	runner.Run(t, disorganizedProgram, func(env *Env) {
 		env.OpenFile("main.go")
 		env.SaveBuffer("main.go")
 		got := env.E.BufferText("main.go")
diff --git a/internal/lsp/regtest/serialization_test.go b/internal/lsp/regtest/serialization_test.go
index 6b7bef0..2ac90d9 100644
--- a/internal/lsp/regtest/serialization_test.go
+++ b/internal/lsp/regtest/serialization_test.go
@@ -5,7 +5,6 @@
 package regtest
 
 import (
-	"context"
 	"encoding/json"
 	"testing"
 
@@ -27,14 +26,14 @@
 }`
 
 func TestHoverSerialization(t *testing.T) {
-	runner.Run(t, simpleProgram, func(ctx context.Context, t *testing.T, env *Env) {
+	runner.Run(t, simpleProgram, func(env *Env) {
 		// Hover on an empty line.
 		params := protocol.HoverParams{}
 		params.TextDocument.URI = env.W.URI("main.go")
 		params.Position.Line = 3
 		params.Position.Character = 0
 		var resp json.RawMessage
-		if err := env.Conn.Call(ctx, "textDocument/hover", &params, &resp); err != nil {
+		if err := env.Conn.Call(env.Ctx, "textDocument/hover", &params, &resp); err != nil {
 			t.Fatal(err)
 		}
 		if len(string(resp)) > 0 {
diff --git a/internal/lsp/regtest/shared_test.go b/internal/lsp/regtest/shared_test.go
index dd465ae..8cf5e9c 100644
--- a/internal/lsp/regtest/shared_test.go
+++ b/internal/lsp/regtest/shared_test.go
@@ -5,7 +5,6 @@
 package regtest
 
 import (
-	"context"
 	"testing"
 )
 
@@ -23,19 +22,19 @@
 	fmt.Println("Hello World.")
 }`
 
-func runShared(t *testing.T, program string, testFunc func(ctx context.Context, t *testing.T, env1 *Env, env2 *Env)) {
+func runShared(t *testing.T, program string, testFunc func(env1 *Env, env2 *Env)) {
 	// Only run these tests in forwarded modes.
 	modes := runner.Modes() & (Forwarded | SeparateProcess)
-	runner.RunInMode(modes, t, sharedProgram, func(ctx context.Context, t *testing.T, env1 *Env) {
+	runner.RunInMode(modes, t, sharedProgram, func(env1 *Env) {
 		// Create a second test session connected to the same workspace and server
 		// as the first.
-		env2 := NewEnv(ctx, t, env1.W, env1.Server)
-		testFunc(ctx, t, env1, env2)
+		env2 := NewEnv(env1.Ctx, t, env1.W, env1.Server)
+		testFunc(env1, env2)
 	})
 }
 
 func TestSimultaneousEdits(t *testing.T) {
-	runShared(t, exampleProgram, func(ctx context.Context, t *testing.T, env1 *Env, env2 *Env) {
+	runShared(t, exampleProgram, func(env1 *Env, env2 *Env) {
 		// In editor #1, break fmt.Println as before.
 		env1.OpenFile("main.go")
 		env1.RegexpReplace("main.go", "Printl(n)", "")
@@ -50,7 +49,7 @@
 }
 
 func TestShutdown(t *testing.T) {
-	runShared(t, sharedProgram, func(ctx context.Context, t *testing.T, env1 *Env, env2 *Env) {
+	runShared(t, sharedProgram, func(env1 *Env, env2 *Env) {
 		env1.CloseEditor()
 		// Now make an edit in editor #2 to trigger diagnostics.
 		env2.OpenFile("main.go")
diff --git a/internal/lsp/regtest/wrappers.go b/internal/lsp/regtest/wrappers.go
index a374b57..ece6063 100644
--- a/internal/lsp/regtest/wrappers.go
+++ b/internal/lsp/regtest/wrappers.go
@@ -11,53 +11,53 @@
 // RemoveFileFromWorkspace deletes a file on disk but does nothing in the
 // editor. It calls t.Fatal on any error.
 func (e *Env) RemoveFileFromWorkspace(name string) {
-	e.t.Helper()
-	if err := e.W.RemoveFile(e.ctx, name); err != nil {
-		e.t.Fatal(err)
+	e.T.Helper()
+	if err := e.W.RemoveFile(e.Ctx, name); err != nil {
+		e.T.Fatal(err)
 	}
 }
 
 // ReadWorkspaceFile reads a file from the workspace, calling t.Fatal on any
 // error.
 func (e *Env) ReadWorkspaceFile(name string) string {
-	e.t.Helper()
+	e.T.Helper()
 	content, err := e.W.ReadFile(name)
 	if err != nil {
-		e.t.Fatal(err)
+		e.T.Fatal(err)
 	}
 	return content
 }
 
 // OpenFile opens a file in the editor, calling t.Fatal on any error.
 func (e *Env) OpenFile(name string) {
-	e.t.Helper()
-	if err := e.E.OpenFile(e.ctx, name); err != nil {
-		e.t.Fatal(err)
+	e.T.Helper()
+	if err := e.E.OpenFile(e.Ctx, name); err != nil {
+		e.T.Fatal(err)
 	}
 }
 
 // CreateBuffer creates a buffer in the editor, calling t.Fatal on any error.
 func (e *Env) CreateBuffer(name string, content string) {
-	e.t.Helper()
-	if err := e.E.CreateBuffer(e.ctx, name, content); err != nil {
-		e.t.Fatal(err)
+	e.T.Helper()
+	if err := e.E.CreateBuffer(e.Ctx, name, content); err != nil {
+		e.T.Fatal(err)
 	}
 }
 
 // CloseBuffer closes an editor buffer without saving, calling t.Fatal on any
 // error.
 func (e *Env) CloseBuffer(name string) {
-	e.t.Helper()
-	if err := e.E.CloseBuffer(e.ctx, name); err != nil {
-		e.t.Fatal(err)
+	e.T.Helper()
+	if err := e.E.CloseBuffer(e.Ctx, name); err != nil {
+		e.T.Fatal(err)
 	}
 }
 
 // EditBuffer applies edits to an editor buffer, calling t.Fatal on any error.
 func (e *Env) EditBuffer(name string, edits ...fake.Edit) {
-	e.t.Helper()
-	if err := e.E.EditBuffer(e.ctx, name, edits); err != nil {
-		e.t.Fatal(err)
+	e.T.Helper()
+	if err := e.E.EditBuffer(e.Ctx, name, edits); err != nil {
+		e.T.Fatal(err)
 	}
 }
 
@@ -65,13 +65,13 @@
 // buffer specified by name, calling t.Fatal on any error. It first searches
 // for the position in open buffers, then in workspace files.
 func (e *Env) RegexpSearch(name, re string) fake.Pos {
-	e.t.Helper()
+	e.T.Helper()
 	pos, err := e.E.RegexpSearch(name, re)
 	if err == fake.ErrUnknownBuffer {
 		pos, err = e.W.RegexpSearch(name, re)
 	}
 	if err != nil {
-		e.t.Fatalf("RegexpSearch: %v", err)
+		e.T.Fatalf("RegexpSearch: %v", err)
 	}
 	return pos
 }
@@ -79,55 +79,55 @@
 // RegexpReplace replaces the first group in the first match of regexpStr with
 // the replace text, calling t.Fatal on any error.
 func (e *Env) RegexpReplace(name, regexpStr, replace string) {
-	e.t.Helper()
-	if err := e.E.RegexpReplace(e.ctx, name, regexpStr, replace); err != nil {
-		e.t.Fatalf("RegexpReplace: %v", err)
+	e.T.Helper()
+	if err := e.E.RegexpReplace(e.Ctx, name, regexpStr, replace); err != nil {
+		e.T.Fatalf("RegexpReplace: %v", err)
 	}
 }
 
 // SaveBuffer saves an editor buffer, calling t.Fatal on any error.
 func (e *Env) SaveBuffer(name string) {
-	e.t.Helper()
-	if err := e.E.SaveBuffer(e.ctx, name); err != nil {
-		e.t.Fatal(err)
+	e.T.Helper()
+	if err := e.E.SaveBuffer(e.Ctx, name); err != nil {
+		e.T.Fatal(err)
 	}
 }
 
 // GoToDefinition goes to definition in the editor, calling t.Fatal on any
 // error.
 func (e *Env) GoToDefinition(name string, pos fake.Pos) (string, fake.Pos) {
-	e.t.Helper()
-	n, p, err := e.E.GoToDefinition(e.ctx, name, pos)
+	e.T.Helper()
+	n, p, err := e.E.GoToDefinition(e.Ctx, name, pos)
 	if err != nil {
-		e.t.Fatal(err)
+		e.T.Fatal(err)
 	}
 	return n, p
 }
 
 // FormatBuffer formats the editor buffer, calling t.Fatal on any error.
 func (e *Env) FormatBuffer(name string) {
-	e.t.Helper()
-	if err := e.E.FormatBuffer(e.ctx, name); err != nil {
-		e.t.Fatal(err)
+	e.T.Helper()
+	if err := e.E.FormatBuffer(e.Ctx, name); err != nil {
+		e.T.Fatal(err)
 	}
 }
 
 // OrganizeImports processes the source.organizeImports codeAction, calling
 // t.Fatal on any error.
 func (e *Env) OrganizeImports(name string) {
-	e.t.Helper()
-	if err := e.E.OrganizeImports(e.ctx, name); err != nil {
-		e.t.Fatal(err)
+	e.T.Helper()
+	if err := e.E.OrganizeImports(e.Ctx, name); err != nil {
+		e.T.Fatal(err)
 	}
 }
 
 // CloseEditor shuts down the editor, calling t.Fatal on any error.
 func (e *Env) CloseEditor() {
-	e.t.Helper()
-	if err := e.E.Shutdown(e.ctx); err != nil {
-		e.t.Fatal(err)
+	e.T.Helper()
+	if err := e.E.Shutdown(e.Ctx); err != nil {
+		e.T.Fatal(err)
 	}
-	if err := e.E.Exit(e.ctx); err != nil {
-		e.t.Fatal(err)
+	if err := e.E.Exit(e.Ctx); err != nil {
+		e.T.Fatal(err)
 	}
 }
