diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/SkylarkCcToolchainConfigureTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/SkylarkCcToolchainConfigureTest.java
index e26b403..381f66e 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/SkylarkCcToolchainConfigureTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/SkylarkCcToolchainConfigureTest.java
@@ -29,23 +29,23 @@
   @Test
   public void testSplitEscaped() throws Exception {
     newTest()
-        .testStatement("split_escaped('a:b:c', ':')", MutableList.of(thread, "a", "b", "c"))
-        .testStatement("split_escaped('a%:b', ':')", MutableList.of(thread, "a:b"))
-        .testStatement("split_escaped('a%%b', ':')", MutableList.of(thread, "a%b"))
-        .testStatement("split_escaped('a:::b', ':')", MutableList.of(thread, "a", "", "", "b"))
-        .testStatement("split_escaped('a:b%:c', ':')", MutableList.of(thread, "a", "b:c"))
-        .testStatement("split_escaped('a%%:b:c', ':')", MutableList.of(thread, "a%", "b", "c"))
-        .testStatement("split_escaped(':a', ':')", MutableList.of(thread, "", "a"))
-        .testStatement("split_escaped('a:', ':')", MutableList.of(thread, "a", ""))
-        .testStatement("split_escaped('::a::', ':')", MutableList.of(thread, "", "", "a", "", ""))
-        .testStatement("split_escaped('%%%:a%%%%:b', ':')", MutableList.of(thread, "%:a%%", "b"))
-        .testStatement("split_escaped('', ':')", MutableList.of(thread))
-        .testStatement("split_escaped('%', ':')", MutableList.of(thread, "%"))
-        .testStatement("split_escaped('%%', ':')", MutableList.of(thread, "%"))
-        .testStatement("split_escaped('%:', ':')", MutableList.of(thread, ":"))
-        .testStatement("split_escaped(':', ':')", MutableList.of(thread, "", ""))
-        .testStatement("split_escaped('a%%b', ':')", MutableList.of(thread, "a%b"))
-        .testStatement("split_escaped('a%:', ':')", MutableList.of(thread, "a:"));
+        .testExpression("split_escaped('a:b:c', ':')", MutableList.of(thread, "a", "b", "c"))
+        .testExpression("split_escaped('a%:b', ':')", MutableList.of(thread, "a:b"))
+        .testExpression("split_escaped('a%%b', ':')", MutableList.of(thread, "a%b"))
+        .testExpression("split_escaped('a:::b', ':')", MutableList.of(thread, "a", "", "", "b"))
+        .testExpression("split_escaped('a:b%:c', ':')", MutableList.of(thread, "a", "b:c"))
+        .testExpression("split_escaped('a%%:b:c', ':')", MutableList.of(thread, "a%", "b", "c"))
+        .testExpression("split_escaped(':a', ':')", MutableList.of(thread, "", "a"))
+        .testExpression("split_escaped('a:', ':')", MutableList.of(thread, "a", ""))
+        .testExpression("split_escaped('::a::', ':')", MutableList.of(thread, "", "", "a", "", ""))
+        .testExpression("split_escaped('%%%:a%%%%:b', ':')", MutableList.of(thread, "%:a%%", "b"))
+        .testExpression("split_escaped('', ':')", MutableList.of(thread))
+        .testExpression("split_escaped('%', ':')", MutableList.of(thread, "%"))
+        .testExpression("split_escaped('%%', ':')", MutableList.of(thread, "%"))
+        .testExpression("split_escaped('%:', ':')", MutableList.of(thread, ":"))
+        .testExpression("split_escaped(':', ':')", MutableList.of(thread, "", ""))
+        .testExpression("split_escaped('a%%b', ':')", MutableList.of(thread, "a%b"))
+        .testExpression("split_escaped('a%:', ':')", MutableList.of(thread, "a:"));
   }
 
   private ModalTestCase newTest(String... skylarkOptions) throws IOException {
diff --git a/src/test/java/com/google/devtools/build/lib/rules/python/PyInfoTest.java b/src/test/java/com/google/devtools/build/lib/rules/python/PyInfoTest.java
index db5d3af..4671ba2 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/python/PyInfoTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/python/PyInfoTest.java
@@ -95,7 +95,7 @@
 
   @Test
   public void starlarkConstructor() throws Exception {
-    eval(
+    exec(
         "info = PyInfo(",
         "    transitive_sources = depset(direct=[dummy_file]),",
         "    uses_shared_libraries = True,",
@@ -116,7 +116,7 @@
 
   @Test
   public void starlarkConstructorDefaults() throws Exception {
-    eval("info = PyInfo(transitive_sources = depset(direct=[dummy_file]))");
+    exec("info = PyInfo(transitive_sources = depset(direct=[dummy_file]))");
     PyInfo info = (PyInfo) lookup("info");
     assertThat(info.getCreationLoc().getStartOffset()).isEqualTo(7);
     assertHasOrderAndContainsExactly(
diff --git a/src/test/java/com/google/devtools/build/lib/rules/python/PyRuntimeInfoTest.java b/src/test/java/com/google/devtools/build/lib/rules/python/PyRuntimeInfoTest.java
index 38c2086..d2d5d9a 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/python/PyRuntimeInfoTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/python/PyRuntimeInfoTest.java
@@ -84,7 +84,7 @@
 
   @Test
   public void starlarkConstructor_InBuildRuntime() throws Exception {
-    eval(
+    exec(
         "info = PyRuntimeInfo(",
         "    interpreter = dummy_interpreter,",
         "    files = depset([dummy_file]),",
@@ -100,7 +100,7 @@
 
   @Test
   public void starlarkConstructor_PlatformRuntime() throws Exception {
-    eval(
+    exec(
         "info = PyRuntimeInfo(", //
         "    interpreter_path = '/system/interpreter',",
         "    python_version = 'PY2',",
@@ -115,7 +115,7 @@
 
   @Test
   public void starlarkConstructor_FilesDefaultsToEmpty() throws Exception {
-    eval(
+    exec(
         "info = PyRuntimeInfo(", //
         "    interpreter = dummy_interpreter,",
         "    python_version = 'PY2',",
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
index 43bdbc7..f9dc053 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
@@ -136,7 +136,7 @@
   }
 
   private void registerDummyStarlarkFunction() throws Exception {
-    eval("def impl():", "  pass");
+    exec("def impl():", "  pass");
   }
 
   @Test
@@ -689,6 +689,7 @@
     assertThat(c.hasAttr("a1", Type.STRING)).isTrue();
   }
 
+  // TODO(adonovan): rename execAndExport
   private void evalAndExport(String... lines) throws Exception {
     ParserInput input = ParserInput.fromLines(lines);
     StarlarkFile file = EvalUtils.parseAndValidateSkylark(input, ev.getStarlarkThread());
@@ -1071,14 +1072,14 @@
   @Test
   public void testStructCreation() throws Exception {
     // TODO(fwe): cannot be handled by current testing suite
-    eval("x = struct(a = 1, b = 2)");
+    exec("x = struct(a = 1, b = 2)");
     assertThat(lookup("x")).isInstanceOf(ClassObject.class);
   }
 
   @Test
   public void testStructFields() throws Exception {
     // TODO(fwe): cannot be handled by current testing suite
-    eval("x = struct(a = 1, b = 2)");
+    exec("x = struct(a = 1, b = 2)");
     ClassObject x = (ClassObject) lookup("x");
     assertThat(x.getValue("a")).isEqualTo(1);
     assertThat(x.getValue("b")).isEqualTo(2);
@@ -1090,14 +1091,15 @@
     assertThat((Boolean) eval("struct(a = 1) == struct(a = 1, b = 2)")).isFalse();
     assertThat((Boolean) eval("struct(a = 1, b = 2) == struct(a = 1)")).isFalse();
     // Compare a recursive object to itself to make sure reference equality is checked
-    assertThat((Boolean) eval("s = (struct(a = 1, b = [])); s.b.append(s); s == s")).isTrue();
+    exec("s = struct(a = 1, b = []); s.b.append(s)");
+    assertThat((Boolean) eval("s == s")).isTrue();
     assertThat((Boolean) eval("struct(a = 1, b = 2) == struct(a = 1, b = 3)")).isFalse();
     assertThat((Boolean) eval("struct(a = 1) == [1]")).isFalse();
     assertThat((Boolean) eval("[1] == struct(a = 1)")).isFalse();
     assertThat((Boolean) eval("struct() == struct()")).isTrue();
     assertThat((Boolean) eval("struct() == struct(a = 1)")).isFalse();
 
-    eval("foo = provider(); bar = provider()");
+    exec("foo = provider(); bar = provider()");
     assertThat((Boolean) eval("struct(a = 1) == foo(a = 1)")).isFalse();
     assertThat((Boolean) eval("foo(a = 1) == struct(a = 1)")).isFalse();
     assertThat((Boolean) eval("foo(a = 1) == bar(a = 1)")).isFalse();
@@ -1114,7 +1116,7 @@
 
   @Test
   public void testStructAccessingFieldsFromSkylark() throws Exception {
-    eval("x = struct(a = 1, b = 2)", "x1 = x.a", "x2 = x.b");
+    exec("x = struct(a = 1, b = 2)", "x1 = x.a", "x2 = x.b");
     assertThat(lookup("x1")).isEqualTo(1);
     assertThat(lookup("x2")).isEqualTo(2);
   }
@@ -1141,7 +1143,7 @@
 
   @Test
   public void testStructAccessingFunctionFieldWithArgs() throws Exception {
-    eval("def f(x): return x+5", "x = struct(a = f, b = 2)", "x1 = x.a(1)");
+    exec("def f(x): return x+5", "x = struct(a = f, b = 2)", "x1 = x.a(1)");
     assertThat(lookup("x1")).isEqualTo(6);
   }
 
@@ -1154,7 +1156,8 @@
   @Test
   public void testStructConcatenationFieldNames() throws Exception {
     // TODO(fwe): cannot be handled by current testing suite
-    eval("x = struct(a = 1, b = 2)",
+    exec(
+        "x = struct(a = 1, b = 2)", //
         "y = struct(c = 1, d = 2)",
         "z = x + y\n");
     StructImpl z = (StructImpl) lookup("z");
@@ -1164,7 +1167,8 @@
   @Test
   public void testStructConcatenationFieldValues() throws Exception {
     // TODO(fwe): cannot be handled by current testing suite
-    eval("x = struct(a = 1, b = 2)",
+    exec(
+        "x = struct(a = 1, b = 2)", //
         "y = struct(c = 1, d = 2)",
         "z = x + y\n");
     StructImpl z = (StructImpl) lookup("z");
@@ -1186,7 +1190,8 @@
   @Test
   public void testConditionalStructConcatenation() throws Exception {
     // TODO(fwe): cannot be handled by current testing suite
-    eval("def func():",
+    exec(
+        "def func():",
         "  x = struct(a = 1, b = 2)",
         "  if True:",
         "    x += struct(c = 1, d = 2)",
@@ -1209,14 +1214,15 @@
 
   @Test
   public void testGetattr() throws Exception {
-    eval("s = struct(a='val')", "x = getattr(s, 'a')", "y = getattr(s, 'b', 'def')");
+    exec("s = struct(a='val')", "x = getattr(s, 'a')", "y = getattr(s, 'b', 'def')");
     assertThat(lookup("x")).isEqualTo("val");
     assertThat(lookup("y")).isEqualTo("def");
   }
 
   @Test
   public void testHasattr() throws Exception {
-    eval("s = struct(a=1)",
+    exec(
+        "s = struct(a=1)", //
         "x = hasattr(s, 'a')",
         "y = hasattr(s, 'b')\n");
     assertThat(lookup("x")).isEqualTo(true);
@@ -1231,12 +1237,12 @@
 
   @Test
   public void testStructsInSets() throws Exception {
-    eval("depset([struct(a='a')])");
+    exec("depset([struct(a='a')])");
   }
 
   @Test
   public void testStructsInDicts() throws Exception {
-    eval("d = {struct(a = 1): 'aa', struct(b = 2): 'bb'}");
+    exec("d = {struct(a = 1): 'aa', struct(b = 2): 'bb'}");
     assertThat(eval("d[struct(a = 1)]")).isEqualTo("aa");
     assertThat(eval("d[struct(b = 2)]")).isEqualTo("bb");
     assertThat(eval("str([d[k] for k in d])")).isEqualTo("[\"aa\", \"bb\"]");
@@ -1246,15 +1252,15 @@
 
   @Test
   public void testStructDictMembersAreMutable() throws Exception {
-    eval(
-        "s = struct(x = {'a' : 1})",
+    exec(
+        "s = struct(x = {'a' : 1})", //
         "s.x['b'] = 2\n");
     assertThat(((StructImpl) lookup("s")).getValue("x")).isEqualTo(ImmutableMap.of("a", 1, "b", 2));
   }
 
   @Test
   public void testNsetGoodCompositeItem() throws Exception {
-    eval("def func():", "  return depset([struct(a='a')])", "s = func()");
+    exec("def func():", "  return depset([struct(a='a')])", "s = func()");
     Collection<?> result = ((SkylarkNestedSet) lookup("s")).toCollection();
     assertThat(result).hasSize(1);
     assertThat(result.iterator().next()).isInstanceOf(StructImpl.class);
@@ -1808,7 +1814,7 @@
 
   @Test
   public void testTypeOfStruct() throws Exception {
-    eval("p = type(struct)", "s = type(struct())");
+    exec("p = type(struct)", "s = type(struct())");
 
     assertThat(lookup("p")).isEqualTo("Provider");
     assertThat(lookup("s")).isEqualTo("struct");
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleContextTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleContextTest.java
index f336712..59b4b9a 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleContextTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleContextTest.java
@@ -692,7 +692,7 @@
   public void testCreateSpawnActionArgumentsWithExecutableFilesToRunProvider() throws Exception {
     SkylarkRuleContext ruleContext = createRuleContext("//foo:androidlib");
     setRuleContext(ruleContext);
-    eval(
+    exec(
         "ruleContext.actions.run(",
         "  inputs = ruleContext.files.srcs,",
         "  outputs = ruleContext.files.srcs,",
@@ -709,7 +709,7 @@
   public void testCreateStarlarkActionArgumentsWithUnusedInputsList() throws Exception {
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     setRuleContext(ruleContext);
-    eval(
+    exec(
         "ruleContext.actions.run(",
         "  inputs = ruleContext.files.srcs,",
         "  outputs = ruleContext.files.srcs,",
@@ -729,7 +729,7 @@
   public void testCreateStarlarkActionArgumentsWithoutUnusedInputsList() throws Exception {
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     setRuleContext(ruleContext);
-    eval(
+    exec(
         "ruleContext.actions.run(",
         "  inputs = ruleContext.files.srcs,",
         "  outputs = ruleContext.files.srcs,",
@@ -905,8 +905,7 @@
   @Test
   public void testDeriveTreeArtifactType() throws Exception {
     setRuleContext(createRuleContext("//foo:foo"));
-    Object result = eval("b = ruleContext.actions.declare_directory('a/b')\n" + "type(b)");
-    assertThat(result).isInstanceOf(String.class);
+    String result = (String) eval("type(ruleContext.actions.declare_directory('a/b'))");
     assertThat(result).isEqualTo("File");
   }
 
@@ -914,11 +913,11 @@
   @Test
   public void testDeriveTreeArtifactNextToSibling() throws Exception {
     setRuleContext(createRuleContext("//foo:foo"));
-    Object result =
-        eval(
-            "b = ruleContext.actions.declare_directory('a/b')\n"
-                + "ruleContext.actions.declare_directory('c', sibling=b)");
-    Artifact artifact = (Artifact) result;
+    Artifact artifact =
+        (Artifact)
+            eval(
+                "ruleContext.actions.declare_directory('c',"
+                    + " sibling=ruleContext.actions.declare_directory('a/b'))");
     PathFragment fragment = artifact.getRootRelativePath();
     assertThat(fragment.getPathString()).isEqualTo("foo/a/c");
     assertThat(artifact.isTreeArtifact()).isTrue();
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleImplementationFunctionsTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleImplementationFunctionsTest.java
index c7c5909..99425da 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleImplementationFunctionsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleImplementationFunctionsTest.java
@@ -203,7 +203,7 @@
             .getDeclaredField("mockFunc")
             .getAnnotation(SkylarkSignature.class));
     update("mock", mockFunc);
-    eval(line);
+    exec(line);
   }
 
   private void checkSkylarkFunctionError(String errorMsg, String line) throws Exception {
@@ -303,7 +303,7 @@
   public void testCreateSpawnActionArgumentsWithExecutable() throws Exception {
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     setRuleContext(ruleContext);
-    eval(
+    exec(
         "ruleContext.actions.run(",
         "  inputs = ruleContext.files.srcs,",
         "  outputs = ruleContext.files.srcs,",
@@ -323,7 +323,7 @@
     // Same test as above, with depset as inputs.
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     setRuleContext(ruleContext);
-    eval(
+    exec(
         "ruleContext.actions.run(",
         "  inputs = depset(ruleContext.files.srcs),",
         "  outputs = ruleContext.files.srcs,",
@@ -355,7 +355,7 @@
   public void testCreateSpawnActionShellCommandList() throws Exception {
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     setRuleContext(ruleContext);
-    eval(
+    exec(
         "ruleContext.actions.run_shell(",
         "  inputs = ruleContext.files.srcs,",
         "  outputs = ruleContext.files.srcs,",
@@ -375,7 +375,7 @@
   public void testCreateSpawnActionEnvAndExecInfo() throws Exception {
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     setRuleContext(ruleContext);
-    eval(
+    exec(
         "ruleContext.actions.run_shell(",
         "  inputs = ruleContext.files.srcs,",
         "  outputs = ruleContext.files.srcs,",
@@ -535,7 +535,7 @@
   public void testCreateFileAction() throws Exception {
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     setRuleContext(ruleContext);
-    eval(
+    exec(
         "ruleContext.actions.write(",
         "  output = ruleContext.files.srcs[0],",
         "  content = 'hello world',",
@@ -666,7 +666,7 @@
   @Test
   public void testResolveCommandMakeVariables() throws Exception {
     setRuleContext(createRuleContext("//foo:resolve_me"));
-    eval(
+    exec(
         "inputs, argv, manifests = ruleContext.resolve_command(",
         "  command='I got the $(HELLO) on a $(DAVE)', ",
         "  make_variables={'HELLO': 'World', 'DAVE': type('')})");
@@ -681,7 +681,7 @@
   @Test
   public void testResolveCommandInputs() throws Exception {
     setRuleContext(createRuleContext("//foo:resolve_me"));
-    eval(
+    exec(
         "inputs, argv, input_manifests = ruleContext.resolve_command(",
         "   tools=ruleContext.attr.tools)");
     @SuppressWarnings("unchecked")
@@ -701,7 +701,7 @@
   @Test
   public void testResolveCommandExpandLocations() throws Exception {
     setRuleContext(createRuleContext("//foo:resolve_me"));
-    eval(
+    exec(
         "def foo():", // no for loops at top-level
         "  label_dict = {}",
         "  all = []",
@@ -724,7 +724,7 @@
   public void testResolveCommandExecutionRequirements() throws Exception {
     // Tests that requires-darwin execution requirements result in the usage of /bin/bash.
     setRuleContext(createRuleContext("//foo:resolve_me"));
-    eval(
+    exec(
         "inputs, argv, manifests = ruleContext.resolve_command(",
         "  execution_requirements={'requires-darwin': ''})");
     @SuppressWarnings("unchecked")
@@ -735,7 +735,7 @@
   @Test
   public void testResolveCommandScript() throws Exception {
     setRuleContext(createRuleContext("//foo:resolve_me"));
-    eval(
+    exec(
         "def foo():", // no for loops at top-level
         "  s = 'a'",
         "  for i in range(1,17): s = s + s", // 2**17 > CommandHelper.maxCommandLength (=64000)
@@ -753,7 +753,7 @@
   public void testResolveTools() throws Exception {
     SkylarkRuleContext ruleContext = createRuleContext("//foo:resolve_me");
     setRuleContext(ruleContext);
-    eval(
+    exec(
         "inputs, input_manifests = ruleContext.resolve_tools(tools=ruleContext.attr.tools)",
         "ruleContext.actions.run(",
         "    outputs = [ruleContext.actions.declare_file('x.out')],",
@@ -799,7 +799,7 @@
   public void testCreateTemplateAction() throws Exception {
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     setRuleContext(ruleContext);
-    eval(
+    exec(
         "ruleContext.actions.expand_template(",
         "  template = ruleContext.files.srcs[0],",
         "  output = ruleContext.files.srcs[1],",
@@ -836,7 +836,7 @@
     Charset utf8 = StandardCharsets.UTF_8;
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     setRuleContext(ruleContext);
-    eval(
+    exec(
         "ruleContext.actions.expand_template(",
         "  template = ruleContext.files.srcs[0],",
         "  output = ruleContext.files.srcs[1],",
@@ -894,16 +894,14 @@
   @Test
   public void testRunfilesArtifactsFromArtifact() throws Exception {
     setRuleContext(createRuleContext("//foo:foo"));
-    Object result =
-        eval("artifacts = ruleContext.files.tools", "ruleContext.runfiles(files = artifacts)");
+    Object result = eval("ruleContext.runfiles(files = ruleContext.files.tools)");
     assertThat(ActionsTestUtil.baseArtifactNames(getRunfileArtifacts(result))).contains("t.exe");
   }
 
   @Test
   public void testRunfilesArtifactsFromIterableArtifacts() throws Exception {
     setRuleContext(createRuleContext("//foo:foo"));
-    Object result =
-        eval("artifacts = ruleContext.files.srcs", "ruleContext.runfiles(files = artifacts)");
+    Object result = eval("ruleContext.runfiles(files = ruleContext.files.srcs)");
     assertThat(ImmutableList.of("a.txt", "b.img"))
         .isEqualTo(ActionsTestUtil.baseArtifactNames(getRunfileArtifacts(result)));
   }
@@ -911,9 +909,7 @@
   @Test
   public void testRunfilesArtifactsFromNestedSetArtifacts() throws Exception {
     setRuleContext(createRuleContext("//foo:foo"));
-    Object result =
-        eval(
-            "ftb = depset(ruleContext.files.srcs)", "ruleContext.runfiles(transitive_files = ftb)");
+    Object result = eval("ruleContext.runfiles(transitive_files = depset(ruleContext.files.srcs))");
     assertThat(ImmutableList.of("a.txt", "b.img"))
         .isEqualTo(ActionsTestUtil.baseArtifactNames(getRunfileArtifacts(result)));
   }
@@ -921,12 +917,10 @@
   @Test
   public void testRunfilesArtifactsFromDefaultAndFiles() throws Exception {
     setRuleContext(createRuleContext("//foo:bar"));
+    // It would be nice to write [DEFAULT] + ruleContext.files.srcs, but artifacts
+    // is an ImmutableList and Skylark interprets it as a tuple.
     Object result =
-        eval(
-            "artifacts = ruleContext.files.srcs",
-            // It would be nice to write [DEFAULT] + artifacts, but artifacts
-            // is an ImmutableList and Skylark interprets it as a tuple.
-            "ruleContext.runfiles(collect_default = True, files = artifacts)");
+        eval("ruleContext.runfiles(collect_default = True, files = ruleContext.files.srcs)");
     // From DEFAULT only libjl.jar comes, see testRunfilesAddFromDependencies().
     assertThat(ImmutableList.of("libjl.jar", "gl.a", "gl.gcgox"))
         .isEqualTo(ActionsTestUtil.baseArtifactNames(getRunfileArtifacts(result)));
@@ -935,10 +929,7 @@
   @Test
   public void testRunfilesArtifactsFromSymlink() throws Exception {
     setRuleContext(createRuleContext("//foo:foo"));
-    Object result =
-        eval(
-            "artifacts = ruleContext.files.srcs",
-            "ruleContext.runfiles(symlinks = {'sym1': artifacts[0]})");
+    Object result = eval("ruleContext.runfiles(symlinks = {'sym1': ruleContext.files.srcs[0]})");
     assertThat(ImmutableList.of("a.txt"))
         .isEqualTo(ActionsTestUtil.baseArtifactNames(getRunfileArtifacts(result)));
   }
@@ -947,9 +938,7 @@
   public void testRunfilesArtifactsFromRootSymlink() throws Exception {
     setRuleContext(createRuleContext("//foo:foo"));
     Object result =
-        eval(
-            "artifacts = ruleContext.files.srcs",
-            "ruleContext.runfiles(root_symlinks = {'sym1': artifacts[0]})");
+        eval("ruleContext.runfiles(root_symlinks = {'sym1': ruleContext.files.srcs[0]})");
     assertThat(ImmutableList.of("a.txt"))
         .isEqualTo(ActionsTestUtil.baseArtifactNames(getRunfileArtifacts(result)));
   }
@@ -958,13 +947,12 @@
   public void testRunfilesSymlinkConflict() throws Exception {
     // Two different artifacts mapped to same path in runfiles
     setRuleContext(createRuleContext("//foo:foo"));
+    exec("prefix = ruleContext.workspace_name + '/' if ruleContext.workspace_name else ''");
     Object result =
         eval(
-            "artifacts = ruleContext.files.srcs",
-            "prefix = ruleContext.workspace_name + '/' if ruleContext.workspace_name else ''",
             "ruleContext.runfiles(",
-            "root_symlinks = {prefix + 'sym1': artifacts[0]},",
-            "symlinks = {'sym1': artifacts[1]})");
+            "  root_symlinks = {prefix + 'sym1': ruleContext.files.srcs[0]},",
+            "  symlinks = {'sym1': ruleContext.files.srcs[1]})");
     Runfiles runfiles = (Runfiles) result;
     reporter.removeHandler(failFastHandler); // So it doesn't throw an exception.
     runfiles.getRunfilesInputs(reporter, null, ArtifactPathResolver.IDENTITY);
@@ -993,7 +981,7 @@
   @Test
   public void testCmdJoinPaths() throws Exception {
     setRuleContext(createRuleContext("//foo:foo"));
-    Object result = eval("f = depset(ruleContext.files.srcs)", "cmd_helper.join_paths(':', f)");
+    Object result = eval("cmd_helper.join_paths(':', depset(ruleContext.files.srcs))");
     assertThat(result).isEqualTo("foo/a.txt:foo/b.img");
   }
 
@@ -2032,7 +2020,7 @@
   public void testArgsScalarAdd() throws Exception {
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     setRuleContext(ruleContext);
-    eval(
+    exec(
         "args = ruleContext.actions.args()",
         "args.add('--foo')",
         "args.add('-')",
@@ -2074,7 +2062,7 @@
   public void testArgsAddAll() throws Exception {
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     setRuleContext(ruleContext);
-    eval(
+    exec(
         "args = ruleContext.actions.args()",
         "args.add_all([1, 2])",
         "args.add('-')",
@@ -2133,7 +2121,7 @@
   public void testArgsAddAllWithMapEach() throws Exception {
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     setRuleContext(ruleContext);
-    eval(
+    exec(
         "def add_one(val): return str(val + 1)",
         "def expand_to_many(val): return ['hey', 'hey']",
         "args = ruleContext.actions.args()",
@@ -2159,7 +2147,7 @@
   public void testOmitIfEmpty() throws Exception {
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     setRuleContext(ruleContext);
-    eval(
+    exec(
         "def add_one(val): return str(val + 1)",
         "def filter(val): return None",
         "args = ruleContext.actions.args()",
@@ -2202,7 +2190,7 @@
   public void testUniquify() throws Exception {
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     setRuleContext(ruleContext);
-    eval(
+    exec(
         "def add_one(val): return str(val + 1)",
         "args = ruleContext.actions.args()",
         "args.add_all(['a', 'b', 'a'])",
@@ -2227,7 +2215,7 @@
   public void testArgsAddJoined() throws Exception {
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     setRuleContext(ruleContext);
-    eval(
+    exec(
         "def add_one(val): return str(val + 1)",
         "args = ruleContext.actions.args()",
         "args.add_joined([1, 2], join_with=':')",
@@ -2273,7 +2261,7 @@
     setSkylarkSemanticsOptions("--incompatible_disallow_old_style_args_add=false");
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     setRuleContext(ruleContext);
-    eval(
+    exec(
         "def map_scalar(val): return 'mapped' + val",
         "def map_vector(vals): return [x + 1 for x in vals]",
         "args = ruleContext.actions.args()",
@@ -2328,7 +2316,7 @@
     setSkylarkSemanticsOptions("--incompatible_disallow_old_style_args_add=false");
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     setRuleContext(ruleContext);
-    eval(
+    exec(
         "args = ruleContext.actions.args()",
         "def bad_fn(args): return [0]",
         "args.add([1, 2], map_fn=bad_fn)",
@@ -2353,7 +2341,7 @@
   public void testMultipleLazyArgsMixedWithStrings() throws Exception {
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     setRuleContext(ruleContext);
-    eval(
+    exec(
         "foo_args = ruleContext.actions.args()",
         "foo_args.add('--foo')",
         "bar_args = ruleContext.actions.args()",
@@ -2401,7 +2389,7 @@
   public void testWriteArgsToParamFile() throws Exception {
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     setRuleContext(ruleContext);
-    eval(
+    exec(
         "args = ruleContext.actions.args()",
         "args.add('--foo')",
         "output=ruleContext.actions.declare_file('out')",
@@ -2481,7 +2469,7 @@
     setSkylarkSemanticsOptions("--incompatible_disallow_old_style_args_add=false");
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     setRuleContext(ruleContext);
-    eval(
+    exec(
         "args = ruleContext.actions.args()",
         "args.add('foo', format='format/%s%s')", // Expects two args, will only be given one
         "ruleContext.actions.run(",
@@ -2536,7 +2524,7 @@
   public void testLazyArgMapEachThrowsError() throws Exception {
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     setRuleContext(ruleContext);
-    eval(
+    exec(
         "args = ruleContext.actions.args()",
         "def bad_fn(val): 'hello'.nosuchmethod()",
         "args.add_all([1, 2], map_each=bad_fn)",
@@ -2559,7 +2547,7 @@
   public void testLazyArgMapEachReturnsNone() throws Exception {
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     setRuleContext(ruleContext);
-    eval(
+    exec(
         "args = ruleContext.actions.args()",
         "def none_fn(val): return None if val == 'nokeep' else val",
         "args.add_all(['keep', 'nokeep'], map_each=none_fn)",
@@ -2580,7 +2568,7 @@
   public void testLazyArgMapEachReturnsWrongType() throws Exception {
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     setRuleContext(ruleContext);
-    eval(
+    exec(
         "args = ruleContext.actions.args()",
         "def bad_fn(val): return 1",
         "args.add_all([1, 2], map_each=bad_fn)",
@@ -2604,7 +2592,7 @@
   public void createShellWithLazyArgs() throws Exception {
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     setRuleContext(ruleContext);
-    eval(
+    exec(
         "args = ruleContext.actions.args()",
         "args.add('--foo')",
         "ruleContext.actions.run_shell(",
@@ -2927,81 +2915,64 @@
 
     ImmutableList.Builder<SkylarkCustomCommandLine> commandLines = ImmutableList.builder();
 
-    commandLines.add(getCommandLine("ruleContext.actions.args()"));
+    commandLines.add(getCommandLine("args = ruleContext.actions.args()"));
+    commandLines.add(getCommandLine("args = ruleContext.actions.args()", "args.add('foo')"));
     commandLines.add(
-        getCommandLine("args = ruleContext.actions.args()", "args.add('foo')", "args"));
+        getCommandLine("args = ruleContext.actions.args()", "args.add('--foo', 'foo')"));
     commandLines.add(
-        getCommandLine("args = ruleContext.actions.args()", "args.add('--foo', 'foo')", "args"));
+        getCommandLine("args = ruleContext.actions.args()", "args.add('foo', format='--foo=%s')"));
+    commandLines.add(
+        getCommandLine("args = ruleContext.actions.args()", "args.add_all(['foo', 'bar'])"));
     commandLines.add(
         getCommandLine(
-            "args = ruleContext.actions.args()", "args.add('foo', format='--foo=%s')", "args"));
-    commandLines.add(
-        getCommandLine(
-            "args = ruleContext.actions.args()", "args.add_all(['foo', 'bar'])", "args"));
-    commandLines.add(
-        getCommandLine(
-            "args = ruleContext.actions.args()", "args.add_all('-foo', ['foo', 'bar'])", "args"));
+            "args = ruleContext.actions.args()", "args.add_all('-foo', ['foo', 'bar'])"));
     commandLines.add(
         getCommandLine(
             "args = ruleContext.actions.args()",
-            "args.add_all(['foo', 'bar'], format_each='format%s')",
-            "args"));
+            "args.add_all(['foo', 'bar'], format_each='format%s')"));
+    commandLines.add(
+        getCommandLine(
+            "args = ruleContext.actions.args()", "args.add_all(['foo', 'bar'], before_each='-I')"));
+    commandLines.add(
+        getCommandLine(
+            "args = ruleContext.actions.args()", "args.add_all(['boing', 'boing', 'boing'])"));
     commandLines.add(
         getCommandLine(
             "args = ruleContext.actions.args()",
-            "args.add_all(['foo', 'bar'], before_each='-I')",
-            "args"));
+            "args.add_all(['boing', 'boing', 'boing'], uniquify=True)"));
     commandLines.add(
         getCommandLine(
             "args = ruleContext.actions.args()",
-            "args.add_all(['boing', 'boing', 'boing'])",
-            "args"));
+            "args.add_all(['foo', 'bar'], terminate_with='baz')"));
+    commandLines.add(
+        getCommandLine(
+            "args = ruleContext.actions.args()", "args.add_joined(['foo', 'bar'], join_with=',')"));
     commandLines.add(
         getCommandLine(
             "args = ruleContext.actions.args()",
-            "args.add_all(['boing', 'boing', 'boing'], uniquify=True)",
-            "args"));
-    commandLines.add(
-        getCommandLine(
-            "args = ruleContext.actions.args()",
-            "args.add_all(['foo', 'bar'], terminate_with='baz')",
-            "args"));
-    commandLines.add(
-        getCommandLine(
-            "args = ruleContext.actions.args()",
-            "args.add_joined(['foo', 'bar'], join_with=',')",
-            "args"));
-    commandLines.add(
-        getCommandLine(
-            "args = ruleContext.actions.args()",
-            "args.add_joined(['foo', 'bar'], join_with=',', format_joined='--foo=%s')",
-            "args"));
+            "args.add_joined(['foo', 'bar'], join_with=',', format_joined='--foo=%s')"));
     commandLines.add(
         getCommandLine(
             "args = ruleContext.actions.args()",
             "def _map_each(s): return s + '_mapped'",
-            "args.add_all(['foo', 'bar'], map_each=_map_each)",
-            "args"));
+            "args.add_all(['foo', 'bar'], map_each=_map_each)"));
     commandLines.add(
         getCommandLine(
             "args = ruleContext.actions.args()",
             "values = depset(['a', 'b'])",
-            "args.add_all(values)",
-            "args"));
+            "args.add_all(values)"));
     commandLines.add(
         getCommandLine(
             "args = ruleContext.actions.args()",
             "def _map_each(s): return s + '_mapped'",
             "values = depset(['a', 'b'])",
-            "args.add_all(values, map_each=_map_each)",
-            "args"));
+            "args.add_all(values, map_each=_map_each)"));
     commandLines.add(
         getCommandLine(
             "args = ruleContext.actions.args()",
             "def _map_each(s): return s + '_mapped_again'",
             "values = depset(['a', 'b'])",
-            "args.add_all(values, map_each=_map_each)",
-            "args"));
+            "args.add_all(values, map_each=_map_each)"));
 
     // Ensure all these command lines have distinct keys
     ActionKeyContext actionKeyContext = new ActionKeyContext();
@@ -3027,23 +2998,22 @@
             "args = ruleContext.actions.args()",
             "def _bad_fn(s): return s.doesnotexist()",
             "values = depset(['a', 'b'])",
-            "args.add_all(values, map_each=_bad_fn)",
-            "args");
+            "args.add_all(values, map_each=_bad_fn)");
     assertThrows(
         CommandLineExpansionException.class,
         () -> commandLine.addToFingerprint(actionKeyContext, new Fingerprint()));
   }
 
   private SkylarkCustomCommandLine getCommandLine(String... lines) throws Exception {
-    return ((SkylarkActionFactory.Args) eval(lines)).build();
+    exec(lines);
+    return ((SkylarkActionFactory.Args) eval("args")).build();
   }
 
   @Test
   public void testPrintArgs() throws Exception {
     setRuleContext(createRuleContext("//foo:foo"));
-    Args args =
-        (Args)
-            eval("args = ruleContext.actions.args()", "args.add_all(['--foo', '--bar'])", "args");
+    exec("args = ruleContext.actions.args()", "args.add_all(['--foo', '--bar'])");
+    Args args = (Args) eval("args");
     assertThat(Printer.debugPrint(args)).isEqualTo("--foo --bar");
   }
 
@@ -3051,14 +3021,12 @@
   public void testDirectoryInArgs() throws Exception {
     setSkylarkSemanticsOptions("--incompatible_expand_directories");
     setRuleContext(createRuleContext("//foo:foo"));
-    SkylarkList<?> result =
-        (SkylarkList<?>)
-            eval(
-                "args = ruleContext.actions.args()",
-                "directory = ruleContext.actions.declare_directory('dir')",
-                "def _short_path(f): return f.short_path", // For easier assertions
-                "args.add_all([directory], map_each=_short_path)",
-                "args, directory");
+    exec(
+        "args = ruleContext.actions.args()",
+        "directory = ruleContext.actions.declare_directory('dir')",
+        "def _short_path(f): return f.short_path", // For easier assertions
+        "args.add_all([directory], map_each=_short_path)");
+    SkylarkList<?> result = (SkylarkList<?>) eval("args, directory");
     Args args = (Args) result.get(0);
     Artifact directory = (Artifact) result.get(1);
     CommandLine commandLine = args.build();
@@ -3080,14 +3048,12 @@
   public void testDirectoryInArgsIncompatibleFlagOff() throws Exception {
     setSkylarkSemanticsOptions("--noincompatible_expand_directories");
     setRuleContext(createRuleContext("//foo:foo"));
-    SkylarkList<?> result =
-        (SkylarkList<?>)
-            eval(
-                "args = ruleContext.actions.args()",
-                "directory = ruleContext.actions.declare_directory('dir')",
-                "def _short_path(f): return f.short_path", // For easier assertions
-                "args.add_all([directory], map_each=_short_path)",
-                "args, directory");
+    exec(
+        "args = ruleContext.actions.args()",
+        "directory = ruleContext.actions.declare_directory('dir')",
+        "def _short_path(f): return f.short_path", // For easier assertions
+        "args.add_all([directory], map_each=_short_path)");
+    SkylarkList<?> result = (SkylarkList<?>) eval("args, directory");
     Args args = (Args) result.get(0);
     Artifact directory = (Artifact) result.get(1);
     CommandLine commandLine = args.build();
@@ -3105,15 +3071,13 @@
   public void testDirectoryInArgsExpandDirectories() throws Exception {
     setSkylarkSemanticsOptions("--incompatible_expand_directories");
     setRuleContext(createRuleContext("//foo:foo"));
-    SkylarkList<?> result =
-        (SkylarkList<?>)
-            eval(
-                "args = ruleContext.actions.args()",
-                "directory = ruleContext.actions.declare_directory('dir')",
-                "def _short_path(f): return f.short_path", // For easier assertions
-                "args.add_all([directory], map_each=_short_path, expand_directories=True)",
-                "args.add_all([directory], map_each=_short_path, expand_directories=False)",
-                "args, directory");
+    exec(
+        "args = ruleContext.actions.args()",
+        "directory = ruleContext.actions.declare_directory('dir')",
+        "def _short_path(f): return f.short_path", // For easier assertions
+        "args.add_all([directory], map_each=_short_path, expand_directories=True)",
+        "args.add_all([directory], map_each=_short_path, expand_directories=False)");
+    SkylarkList<?> result = (SkylarkList<?>) eval("args, directory");
     Args args = (Args) result.get(0);
     Artifact directory = (Artifact) result.get(1);
     CommandLine commandLine = args.build();
@@ -3143,13 +3107,11 @@
   public void testDirectoryInScalarArgsIsOkWithoutIncompatibleFlag() throws Exception {
     setSkylarkSemanticsOptions("--noincompatible_expand_directories");
     setRuleContext(createRuleContext("//foo:foo"));
-    Args args =
-        (Args)
-            eval(
-                "args = ruleContext.actions.args()",
-                "directory = ruleContext.actions.declare_directory('dir')",
-                "args.add(directory)",
-                "args");
+    exec(
+        "args = ruleContext.actions.args()",
+        "directory = ruleContext.actions.declare_directory('dir')",
+        "args.add(directory)");
+    Args args = (Args) eval("args");
     assertThat(Iterables.getOnlyElement(args.build().arguments())).endsWith("foo/dir");
   }
 
@@ -3158,15 +3120,13 @@
     setSkylarkSemanticsOptions("--incompatible_expand_directories");
     SkylarkRuleContext ctx = createRuleContext("//foo:foo");
     setRuleContext(ctx);
-    SkylarkList<?> result =
-        (SkylarkList<?>)
-            eval(
-                "args = ruleContext.actions.args()",
-                "directory = ruleContext.actions.declare_directory('dir')",
-                "args.add_all([directory])",
-                "params = ruleContext.actions.declare_file('params')",
-                "ruleContext.actions.write(params, args)",
-                "params, directory");
+    exec(
+        "args = ruleContext.actions.args()",
+        "directory = ruleContext.actions.declare_directory('dir')",
+        "args.add_all([directory])",
+        "params = ruleContext.actions.declare_file('params')",
+        "ruleContext.actions.write(params, args)");
+    SkylarkList<?> result = (SkylarkList<?>) eval("params, directory");
     Artifact params = (Artifact) result.get(0);
     Artifact directory = (Artifact) result.get(1);
     ActionAnalysisMetadata action =
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/util/SkylarkTestCase.java b/src/test/java/com/google/devtools/build/lib/skylark/util/SkylarkTestCase.java
index 9490885..27fda47 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/util/SkylarkTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/util/SkylarkTestCase.java
@@ -91,6 +91,10 @@
     return ev.eval(input);
   }
 
+  protected final void exec(String... lines) throws Exception {
+    ev.exec(lines);
+  }
+
   protected final void update(String name, Object value) throws Exception {
     ev.update(name, value);
   }
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/BaseFunctionTest.java b/src/test/java/com/google/devtools/build/lib/syntax/BaseFunctionTest.java
index 7e71328..79eeaa7 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/BaseFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/BaseFunctionTest.java
@@ -130,7 +130,7 @@
   @SuppressWarnings("unchecked")
   @Test
   public void testKwParam() throws Exception {
-    eval(
+    exec(
         "def foo(a, b, c=3, d=4, g=7, h=8, *args, **kwargs):\n"
             + "  return (a, b, c, d, g, h, args, kwargs)\n"
             + "v1 = foo(1, 2)\n"
@@ -159,7 +159,7 @@
   public void testTrailingCommas() throws Exception {
     // Test that trailing commas are allowed in function definitions and calls
     // even after last *args or **kwargs expressions, like python3
-    eval(
+    exec(
         "def f(*args, **kwargs): pass\n"
             + "v1 = f(1,)\n"
             + "v2 = f(*(1,2),)\n"
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/EvaluationTest.java b/src/test/java/com/google/devtools/build/lib/syntax/EvaluationTest.java
index db3ac9c..afdb1cf 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/EvaluationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/EvaluationTest.java
@@ -64,7 +64,7 @@
             .build();
     ParserInput input = ParserInput.fromLines("print('hello'); x = 1//0; print('goodbye')");
     try {
-      EvalUtils.execOrEval(input, thread);
+      EvalUtils.exec(input, thread);
       throw new AssertionError("execution succeeded unexpectedly");
     } catch (EvalException ex) {
       // ok, division by zero
@@ -80,14 +80,14 @@
   @Test
   public void testExprs() throws Exception {
     newTest()
-        .testStatement("'%sx' % 'foo' + 'bar1'", "fooxbar1")
-        .testStatement("('%sx' % 'foo') + 'bar2'", "fooxbar2")
-        .testStatement("'%sx' % ('foo' + 'bar3')", "foobar3x")
-        .testStatement("123 + 456", 579)
-        .testStatement("456 - 123", 333)
-        .testStatement("8 % 3", 2)
+        .testExpression("'%sx' % 'foo' + 'bar1'", "fooxbar1")
+        .testExpression("('%sx' % 'foo') + 'bar2'", "fooxbar2")
+        .testExpression("'%sx' % ('foo' + 'bar3')", "foobar3x")
+        .testExpression("123 + 456", 579)
+        .testExpression("456 - 123", 333)
+        .testExpression("8 % 3", 2)
         .testIfErrorContains("unsupported operand type(s) for %: 'int' and 'string'", "3 % 'foo'")
-        .testStatement("-5", -5)
+        .testExpression("-5", -5)
         .testIfErrorContains("unsupported unary operation: -string", "-'foo'");
   }
 
@@ -98,38 +98,35 @@
 
   @Test
   public void testStringFormatMultipleArgs() throws Exception {
-    newTest().testStatement("'%sY%s' % ('X', 'Z')", "XYZ");
+    newTest().testExpression("'%sY%s' % ('X', 'Z')", "XYZ");
   }
 
   @Test
   public void testConditionalExpressions() throws Exception {
     newTest()
-        .testStatement("1 if True else 2", 1)
-        .testStatement("1 if False else 2", 2)
-        .testStatement("1 + 2 if 3 + 4 else 5 + 6", 3);
+        .testExpression("1 if True else 2", 1)
+        .testExpression("1 if False else 2", 2)
+        .testExpression("1 + 2 if 3 + 4 else 5 + 6", 3);
   }
 
   @Test
   public void testListComparison() throws Exception {
     newTest()
-        .testStatement("[] < [1]", true)
-        .testStatement("[1] < [1, 1]", true)
-        .testStatement("[1, 1] < [1, 2]", true)
-        .testStatement("[1, 2] < [1, 2, 3]", true)
-        .testStatement("[1, 2, 3] <= [1, 2, 3]", true)
-
-        .testStatement("['a', 'b'] > ['a']", true)
-        .testStatement("['a', 'b'] >= ['a']", true)
-        .testStatement("['a', 'b'] < ['a']", false)
-        .testStatement("['a', 'b'] <= ['a']", false)
-
-        .testStatement("('a', 'b') > ('a', 'b')", false)
-        .testStatement("('a', 'b') >= ('a', 'b')", true)
-        .testStatement("('a', 'b') < ('a', 'b')", false)
-        .testStatement("('a', 'b') <= ('a', 'b')", true)
-
-        .testStatement("[[1, 1]] > [[1, 1], []]", false)
-        .testStatement("[[1, 1]] < [[1, 1], []]", true);
+        .testExpression("[] < [1]", true)
+        .testExpression("[1] < [1, 1]", true)
+        .testExpression("[1, 1] < [1, 2]", true)
+        .testExpression("[1, 2] < [1, 2, 3]", true)
+        .testExpression("[1, 2, 3] <= [1, 2, 3]", true)
+        .testExpression("['a', 'b'] > ['a']", true)
+        .testExpression("['a', 'b'] >= ['a']", true)
+        .testExpression("['a', 'b'] < ['a']", false)
+        .testExpression("['a', 'b'] <= ['a']", false)
+        .testExpression("('a', 'b') > ('a', 'b')", false)
+        .testExpression("('a', 'b') >= ('a', 'b')", true)
+        .testExpression("('a', 'b') < ('a', 'b')", false)
+        .testExpression("('a', 'b') <= ('a', 'b')", true)
+        .testExpression("[[1, 1]] > [[1, 1], []]", false)
+        .testExpression("[[1, 1]] < [[1, 1], []]", true);
   }
 
   @Test
@@ -155,15 +152,20 @@
           }
         };
 
-    newTest().update(sum.getName(), sum).testStatement("sum(1, 2, 3, 4, 5, 6)", 21)
-        .testStatement("sum", sum).testStatement("sum(a=1, b=2)", 0);
+    newTest()
+        .update(sum.getName(), sum)
+        .testExpression("sum(1, 2, 3, 4, 5, 6)", 21)
+        .testExpression("sum", sum)
+        .testExpression("sum(a=1, b=2)", 0);
   }
 
   @Test
   public void testNotCallInt() throws Exception {
-    newTest().setUp("sum = 123456").testLookup("sum", 123456)
+    newTest()
+        .setUp("sum = 123456")
+        .testLookup("sum", 123456)
         .testIfExactError("'int' object is not callable", "sum(1, 2, 3, 4, 5, 6)")
-        .testStatement("sum", 123456);
+        .testExpression("sum", 123456);
   }
 
   @Test
@@ -201,24 +203,24 @@
   @Test
   public void testModulo() throws Exception {
     newTest()
-        .testStatement("6 % 2", 0)
-        .testStatement("6 % 4", 2)
-        .testStatement("3 % 6", 3)
-        .testStatement("7 % -4", -1)
-        .testStatement("-7 % 4", 1)
-        .testStatement("-7 % -4", -3)
+        .testExpression("6 % 2", 0)
+        .testExpression("6 % 4", 2)
+        .testExpression("3 % 6", 3)
+        .testExpression("7 % -4", -1)
+        .testExpression("-7 % 4", 1)
+        .testExpression("-7 % -4", -3)
         .testIfExactError("integer modulo by zero", "5 % 0");
   }
 
   @Test
   public void testMult() throws Exception {
     newTest()
-        .testStatement("6 * 7", 42)
-        .testStatement("3 * 'ab'", "ababab")
-        .testStatement("0 * 'ab'", "")
-        .testStatement("'1' + '0' * 5", "100000")
-        .testStatement("'ab' * -4", "")
-        .testStatement("-1 * ''", "");
+        .testExpression("6 * 7", 42)
+        .testExpression("3 * 'ab'", "ababab")
+        .testExpression("0 * 'ab'", "")
+        .testExpression("'1' + '0' * 5", "100000")
+        .testExpression("'ab' * -4", "")
+        .testExpression("-1 * ''", "");
   }
 
   @Test
@@ -229,13 +231,13 @@
   @Test
   public void testFloorDivision() throws Exception {
     newTest()
-        .testStatement("6 // 2", 3)
-        .testStatement("6 // 4", 1)
-        .testStatement("3 // 6", 0)
-        .testStatement("7 // -2", -4)
-        .testStatement("-7 // 2", -4)
-        .testStatement("-7 // -2", 3)
-        .testStatement("2147483647 // 2", 1073741823)
+        .testExpression("6 // 2", 3)
+        .testExpression("6 // 4", 1)
+        .testExpression("3 // 6", 0)
+        .testExpression("7 // -2", -4)
+        .testExpression("-7 // 2", -4)
+        .testExpression("-7 // -2", 3)
+        .testExpression("2147483647 // 2", 1073741823)
         .testIfErrorContains("unsupported operand type(s) for //: 'string' and 'int'", "'str' // 2")
         .testIfExactError("integer division by zero", "5 // 0");
   }
@@ -255,14 +257,14 @@
   @Test
   public void testOperatorPrecedence() throws Exception {
     newTest()
-        .testStatement("2 + 3 * 4", 14)
-        .testStatement("2 + 3 // 4", 2)
-        .testStatement("2 * 3 + 4 // -2", 4);
+        .testExpression("2 + 3 * 4", 14)
+        .testExpression("2 + 3 // 4", 2)
+        .testExpression("2 * 3 + 4 // -2", 4);
   }
 
   @Test
   public void testConcatStrings() throws Exception {
-    newTest().testStatement("'foo' + 'bar'", "foobar");
+    newTest().testExpression("'foo' + 'bar'", "foobar");
   }
 
   @SuppressWarnings("unchecked")
@@ -327,10 +329,12 @@
   @Test
   public void testNestedListComprehensions() throws Exception {
     newTest()
-        .testExactOrder("li = [[1, 2], [3, 4]]\n" + "[j for i in li for j in i]", 1, 2, 3, 4)
+        .setUp("li = [[1, 2], [3, 4]]")
+        .testExactOrder("[j for i in li for j in i]", 1, 2, 3, 4);
+    newTest()
+        .setUp("input = [['abc'], ['def', 'ghi']]\n")
         .testExactOrder(
-            "input = [['abc'], ['def', 'ghi']]\n"
-                + "['%s %s' % (b, c) for a in input for b in a for c in b.elems()]",
+            "['%s %s' % (b, c) for a in input for b in a for c in b.elems()]",
             "abc a", "abc b", "abc c", "def d", "def e", "def f", "ghi g", "ghi h", "ghi i");
   }
 
@@ -426,15 +430,16 @@
   @Test
   public void testDictComprehensions() throws Exception {
     newTest()
-        .testStatement("{a : a for a in []}", Collections.emptyMap())
-        .testStatement("{b : b for b in [1, 2]}", ImmutableMap.of(1, 1, 2, 2))
-        .testStatement("{c : 'v_' + c for c in ['a', 'b']}",
-            ImmutableMap.of("a", "v_a", "b", "v_b"))
-        .testStatement("{'k_' + d : d for d in ['a', 'b']}",
-            ImmutableMap.of("k_a", "a", "k_b", "b"))
-        .testStatement("{'k_' + e : 'v_' + e for e in ['a', 'b']}",
+        .testExpression("{a : a for a in []}", Collections.emptyMap())
+        .testExpression("{b : b for b in [1, 2]}", ImmutableMap.of(1, 1, 2, 2))
+        .testExpression(
+            "{c : 'v_' + c for c in ['a', 'b']}", ImmutableMap.of("a", "v_a", "b", "v_b"))
+        .testExpression(
+            "{'k_' + d : d for d in ['a', 'b']}", ImmutableMap.of("k_a", "a", "k_b", "b"))
+        .testExpression(
+            "{'k_' + e : 'v_' + e for e in ['a', 'b']}",
             ImmutableMap.of("k_a", "v_a", "k_b", "v_b"))
-        .testStatement("{x+y : x*y for x, y in [[2, 3]]}", ImmutableMap.of(5, 6));
+        .testExpression("{x+y : x*y for x, y in [[2, 3]]}", ImmutableMap.of(5, 6));
   }
 
   @Test
@@ -444,23 +449,25 @@
 
   @Test
   public void testDictComprehension_ManyClauses() throws Exception {
-    new SkylarkTest().testStatement(
-        "{x : x * y for x in range(1, 10) if x % 2 == 0 for y in range(1, 10) if y == x}",
-        ImmutableMap.of(2, 4, 4, 16, 6, 36, 8, 64));
+    new SkylarkTest()
+        .testExpression(
+            "{x : x * y for x in range(1, 10) if x % 2 == 0 for y in range(1, 10) if y == x}",
+            ImmutableMap.of(2, 4, 4, 16, 6, 36, 8, 64));
   }
 
   @Test
   public void testDictComprehensions_MultipleKey() throws Exception {
-    newTest().testStatement("{x : x for x in [1, 2, 1]}", ImmutableMap.of(1, 1, 2, 2))
-        .testStatement("{y : y for y in ['ab', 'c', 'a' + 'b']}",
-            ImmutableMap.of("ab", "ab", "c", "c"));
+    newTest()
+        .testExpression("{x : x for x in [1, 2, 1]}", ImmutableMap.of(1, 1, 2, 2))
+        .testExpression(
+            "{y : y for y in ['ab', 'c', 'a' + 'b']}", ImmutableMap.of("ab", "ab", "c", "c"));
   }
 
   @Test
   public void testListConcatenation() throws Exception {
     newTest()
-        .testStatement("[1, 2] + [3, 4]", MutableList.of(thread, 1, 2, 3, 4))
-        .testStatement("(1, 2) + (3, 4)", Tuple.of(1, 2, 3, 4))
+        .testExpression("[1, 2] + [3, 4]", MutableList.of(thread, 1, 2, 3, 4))
+        .testExpression("(1, 2) + (3, 4)", Tuple.of(1, 2, 3, 4))
         .testIfExactError(
             "unsupported operand type(s) for +: 'list' and 'tuple'", "[1, 2] + (3, 4)")
         .testIfExactError(
@@ -470,35 +477,35 @@
   @Test
   public void testListMultiply() throws Exception {
     newTest()
-        .testStatement("[1, 2, 3] * 1", MutableList.of(thread, 1, 2, 3))
-        .testStatement("[1, 2] * 2", MutableList.of(thread, 1, 2, 1, 2))
-        .testStatement("[1, 2] * 3", MutableList.of(thread, 1, 2, 1, 2, 1, 2))
-        .testStatement("[1, 2] * 4", MutableList.of(thread, 1, 2, 1, 2, 1, 2, 1, 2))
-        .testStatement("[8] * 5", MutableList.of(thread, 8, 8, 8, 8, 8))
-        .testStatement("[    ] * 10", MutableList.empty())
-        .testStatement("[1, 2] * 0", MutableList.empty())
-        .testStatement("[1, 2] * -4", MutableList.empty())
-        .testStatement("2 * [1, 2]", MutableList.of(thread, 1, 2, 1, 2))
-        .testStatement("10 * []", MutableList.empty())
-        .testStatement("0 * [1, 2]", MutableList.empty())
-        .testStatement("-4 * [1, 2]", MutableList.empty());
+        .testExpression("[1, 2, 3] * 1", MutableList.of(thread, 1, 2, 3))
+        .testExpression("[1, 2] * 2", MutableList.of(thread, 1, 2, 1, 2))
+        .testExpression("[1, 2] * 3", MutableList.of(thread, 1, 2, 1, 2, 1, 2))
+        .testExpression("[1, 2] * 4", MutableList.of(thread, 1, 2, 1, 2, 1, 2, 1, 2))
+        .testExpression("[8] * 5", MutableList.of(thread, 8, 8, 8, 8, 8))
+        .testExpression("[    ] * 10", MutableList.empty())
+        .testExpression("[1, 2] * 0", MutableList.empty())
+        .testExpression("[1, 2] * -4", MutableList.empty())
+        .testExpression("2 * [1, 2]", MutableList.of(thread, 1, 2, 1, 2))
+        .testExpression("10 * []", MutableList.empty())
+        .testExpression("0 * [1, 2]", MutableList.empty())
+        .testExpression("-4 * [1, 2]", MutableList.empty());
   }
 
   @Test
   public void testTupleMultiply() throws Exception {
     newTest()
-        .testStatement("(1, 2, 3) * 1", Tuple.of(1, 2, 3))
-        .testStatement("(1, 2) * 2", Tuple.of(1, 2, 1, 2))
-        .testStatement("(1, 2) * 3", Tuple.of(1, 2, 1, 2, 1, 2))
-        .testStatement("(1, 2) * 4", Tuple.of(1, 2, 1, 2, 1, 2, 1, 2))
-        .testStatement("(8,) * 5", Tuple.of(8, 8, 8, 8, 8))
-        .testStatement("(    ) * 10", Tuple.empty())
-        .testStatement("(1, 2) * 0", Tuple.empty())
-        .testStatement("(1, 2) * -4", Tuple.empty())
-        .testStatement("2 * (1, 2)", Tuple.of(1, 2, 1, 2))
-        .testStatement("10 * ()", Tuple.empty())
-        .testStatement("0 * (1, 2)", Tuple.empty())
-        .testStatement("-4 * (1, 2)", Tuple.empty());
+        .testExpression("(1, 2, 3) * 1", Tuple.of(1, 2, 3))
+        .testExpression("(1, 2) * 2", Tuple.of(1, 2, 1, 2))
+        .testExpression("(1, 2) * 3", Tuple.of(1, 2, 1, 2, 1, 2))
+        .testExpression("(1, 2) * 4", Tuple.of(1, 2, 1, 2, 1, 2, 1, 2))
+        .testExpression("(8,) * 5", Tuple.of(8, 8, 8, 8, 8))
+        .testExpression("(    ) * 10", Tuple.empty())
+        .testExpression("(1, 2) * 0", Tuple.empty())
+        .testExpression("(1, 2) * -4", Tuple.empty())
+        .testExpression("2 * (1, 2)", Tuple.of(1, 2, 1, 2))
+        .testExpression("10 * ()", Tuple.empty())
+        .testExpression("0 * (1, 2)", Tuple.empty())
+        .testExpression("-4 * (1, 2)", Tuple.empty());
   }
 
   @SuppressWarnings("unchecked")
@@ -546,7 +553,7 @@
 
   @Test
   public void testListComprehensionOnDictionary() throws Exception {
-    newTest().testExactOrder("val = ['var_' + n for n in {'a':1,'b':2}] ; val", "var_a", "var_b");
+    newTest().testExactOrder("['var_' + n for n in {'a':1,'b':2}]", "var_a", "var_b");
   }
 
   @Test
@@ -602,29 +609,29 @@
   @Test
   public void testInOperator() throws Exception {
     newTest()
-        .testStatement("'b' in ['a', 'b']", Boolean.TRUE)
-        .testStatement("'c' in ['a', 'b']", Boolean.FALSE)
-        .testStatement("'b' in ('a', 'b')", Boolean.TRUE)
-        .testStatement("'c' in ('a', 'b')", Boolean.FALSE)
-        .testStatement("'b' in {'a' : 1, 'b' : 2}", Boolean.TRUE)
-        .testStatement("'c' in {'a' : 1, 'b' : 2}", Boolean.FALSE)
-        .testStatement("1 in {'a' : 1, 'b' : 2}", Boolean.FALSE)
-        .testStatement("'b' in 'abc'", Boolean.TRUE)
-        .testStatement("'d' in 'abc'", Boolean.FALSE);
+        .testExpression("'b' in ['a', 'b']", Boolean.TRUE)
+        .testExpression("'c' in ['a', 'b']", Boolean.FALSE)
+        .testExpression("'b' in ('a', 'b')", Boolean.TRUE)
+        .testExpression("'c' in ('a', 'b')", Boolean.FALSE)
+        .testExpression("'b' in {'a' : 1, 'b' : 2}", Boolean.TRUE)
+        .testExpression("'c' in {'a' : 1, 'b' : 2}", Boolean.FALSE)
+        .testExpression("1 in {'a' : 1, 'b' : 2}", Boolean.FALSE)
+        .testExpression("'b' in 'abc'", Boolean.TRUE)
+        .testExpression("'d' in 'abc'", Boolean.FALSE);
   }
 
   @Test
   public void testNotInOperator() throws Exception {
     newTest()
-        .testStatement("'b' not in ['a', 'b']", Boolean.FALSE)
-        .testStatement("'c' not in ['a', 'b']", Boolean.TRUE)
-        .testStatement("'b' not in ('a', 'b')", Boolean.FALSE)
-        .testStatement("'c' not in ('a', 'b')", Boolean.TRUE)
-        .testStatement("'b' not in {'a' : 1, 'b' : 2}", Boolean.FALSE)
-        .testStatement("'c' not in {'a' : 1, 'b' : 2}", Boolean.TRUE)
-        .testStatement("1 not in {'a' : 1, 'b' : 2}", Boolean.TRUE)
-        .testStatement("'b' not in 'abc'", Boolean.FALSE)
-        .testStatement("'d' not in 'abc'", Boolean.TRUE);
+        .testExpression("'b' not in ['a', 'b']", Boolean.FALSE)
+        .testExpression("'c' not in ['a', 'b']", Boolean.TRUE)
+        .testExpression("'b' not in ('a', 'b')", Boolean.FALSE)
+        .testExpression("'c' not in ('a', 'b')", Boolean.TRUE)
+        .testExpression("'b' not in {'a' : 1, 'b' : 2}", Boolean.FALSE)
+        .testExpression("'c' not in {'a' : 1, 'b' : 2}", Boolean.TRUE)
+        .testExpression("1 not in {'a' : 1, 'b' : 2}", Boolean.TRUE)
+        .testExpression("'b' not in 'abc'", Boolean.FALSE)
+        .testExpression("'d' not in 'abc'", Boolean.TRUE);
   }
 
   @Test
@@ -637,7 +644,7 @@
 
   @Test
   public void testInCompositeForPrecedence() throws Exception {
-    newTest().testStatement("not 'a' in ['a'] or 0", 0);
+    newTest().testExpression("not 'a' in ['a'] or 0", 0);
   }
 
   private SkylarkValue createObjWithStr() {
@@ -651,22 +658,20 @@
 
   @Test
   public void testPercOnObject() throws Exception {
-    newTest()
-        .update("obj", createObjWithStr())
-        .testStatement("'%s' % obj", "<str marker>");
+    newTest().update("obj", createObjWithStr()).testExpression("'%s' % obj", "<str marker>");
     newTest()
         .update("unknown", new Object())
-        .testStatement("'%s' % unknown", "<unknown object java.lang.Object>");
+        .testExpression("'%s' % unknown", "<unknown object java.lang.Object>");
   }
 
   @Test
   public void testPercOnObjectList() throws Exception {
     newTest()
         .update("obj", createObjWithStr())
-        .testStatement("'%s %s' % (obj, obj)", "<str marker> <str marker>");
+        .testExpression("'%s %s' % (obj, obj)", "<str marker> <str marker>");
     newTest()
         .update("unknown", new Object())
-        .testStatement(
+        .testExpression(
             "'%s %s' % (unknown, unknown)",
             "<unknown object java.lang.Object> <unknown object java.lang.Object>");
   }
@@ -680,7 +685,7 @@
 
   @Test
   public void testDictKeys() throws Exception {
-    newTest().testExactOrder("v = {'a': 1}.keys() + ['b', 'c'] ; v", "a", "b", "c");
+    newTest().testExactOrder("{'a': 1}.keys() + ['b', 'c']", "a", "b", "c");
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/FunctionTest.java b/src/test/java/com/google/devtools/build/lib/syntax/FunctionTest.java
index 4443dde..4bd118b 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/FunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/FunctionTest.java
@@ -32,7 +32,8 @@
 
   @Test
   public void testFunctionDef() throws Exception {
-    eval("def func(a,b,c):",
+    exec(
+        "def func(a,b,c):", //
         "  a = 1",
         "  b = a\n");
     StarlarkFunction stmt = (StarlarkFunction) lookup("func");
@@ -58,7 +59,8 @@
   public void testFunctionDefCallOuterFunc() throws Exception {
     List<Object> params = new ArrayList<>();
     createOuterFunction(params);
-    eval("def func(a):",
+    exec(
+        "def func(a):", //
         "  outer_func(a)",
         "func(1)",
         "func(2)");
@@ -85,7 +87,8 @@
   @Test
   public void testFunctionDefNoEffectOutsideScope() throws Exception {
     update("a", 1);
-    eval("def func():",
+    exec(
+        "def func():", //
         "  a = 2",
         "func()\n");
     assertThat(lookup("a")).isEqualTo(1);
@@ -93,7 +96,8 @@
 
   @Test
   public void testFunctionDefGlobalVaribleReadInFunction() throws Exception {
-    eval("a = 1",
+    exec(
+        "a = 1", //
         "def func():",
         "  b = a",
         "  return b",
@@ -103,7 +107,8 @@
 
   @Test
   public void testFunctionDefLocalGlobalScope() throws Exception {
-    eval("a = 1",
+    exec(
+        "a = 1", //
         "def func():",
         "  a = 2",
         "  b = a",
@@ -139,7 +144,8 @@
 
   @Test
   public void testFunctionDefLocalVariableReferencedAfterAssignment() throws Exception {
-    eval("a = 1",
+    exec(
+        "a = 1", //
         "def func():",
         "  a = 2",
         "  b = a",
@@ -152,13 +158,14 @@
   @SuppressWarnings("unchecked")
   @Test
   public void testSkylarkGlobalComprehensionIsAllowed() throws Exception {
-    eval("a = [i for i in [1, 2, 3]]\n");
+    exec("a = [i for i in [1, 2, 3]]\n");
     assertThat((Iterable<Object>) lookup("a")).containsExactly(1, 2, 3).inOrder();
   }
 
   @Test
   public void testFunctionReturn() throws Exception {
-    eval("def func():",
+    exec(
+        "def func():", //
         "  return 2",
         "b = func()\n");
     assertThat(lookup("b")).isEqualTo(2);
@@ -166,7 +173,8 @@
 
   @Test
   public void testFunctionReturnFromALoop() throws Exception {
-    eval("def func():",
+    exec(
+        "def func():", //
         "  for i in [1, 2, 3, 4, 5]:",
         "    return i",
         "b = func()\n");
@@ -175,7 +183,8 @@
 
   @Test
   public void testFunctionExecutesProperly() throws Exception {
-    eval("def func(a):",
+    exec(
+        "def func(a):",
         "  b = 1",
         "  if a:",
         "    b = 2",
@@ -190,7 +199,8 @@
   public void testFunctionCallFromFunction() throws Exception {
     final List<Object> params = new ArrayList<>();
     createOuterFunction(params);
-    eval("def func2(a):",
+    exec(
+        "def func2(a):",
         "  outer_func(a)",
         "def func1(b):",
         "  func2(b)",
@@ -201,7 +211,8 @@
 
   @Test
   public void testFunctionCallFromFunctionReadGlobalVar() throws Exception {
-    eval("a = 1",
+    exec(
+        "a = 1", //
         "def func2():",
         "  return a",
         "def func1():",
@@ -212,7 +223,8 @@
 
   @Test
   public void testFunctionParamCanShadowGlobalVarAfterGlobalVarIsRead() throws Exception {
-    eval("a = 1",
+    exec(
+        "a = 1",
         "def func2(a):",
         "  return 0",
         "def func1():",
@@ -224,14 +236,16 @@
 
   @Test
   public void testSingleLineFunction() throws Exception {
-    eval("def func(): return 'a'",
+    exec(
+        "def func(): return 'a'", //
         "s = func()\n");
     assertThat(lookup("s")).isEqualTo("a");
   }
 
   @Test
   public void testFunctionReturnsDictionary() throws Exception {
-    eval("def func(): return {'a' : 1}",
+    exec(
+        "def func(): return {'a' : 1}", //
         "d = func()",
         "a = d['a']\n");
     assertThat(lookup("a")).isEqualTo(1);
@@ -239,7 +253,8 @@
 
   @Test
   public void testFunctionReturnsList() throws Exception {
-    eval("def func(): return [1, 2, 3]",
+    exec(
+        "def func(): return [1, 2, 3]", //
         "d = func()",
         "a = d[1]\n");
     assertThat(lookup("a")).isEqualTo(2);
@@ -247,7 +262,8 @@
 
   @Test
   public void testFunctionNameAliasing() throws Exception {
-    eval("def func(a):",
+    exec(
+        "def func(a):", //
         "  return a + 1",
         "alias = func",
         "r = alias(1)");
@@ -256,7 +272,8 @@
 
   @Test
   public void testCallingFunctionsWithMixedModeArgs() throws Exception {
-    eval("def func(a, b, c):",
+    exec(
+        "def func(a, b, c):", //
         "  return a + b + c",
         "v = func(1, c = 2, b = 3)");
     assertThat(lookup("v")).isEqualTo(6);
@@ -274,7 +291,8 @@
 
   @Test
   public void testWhichOptionalArgsAreDefinedForFunctions() throws Exception {
-    eval(functionWithOptionalArgs(),
+    exec(
+        functionWithOptionalArgs(),
         "v1 = func('1', 1, 1)",
         "v2 = func(b = 2, a = '2', c = 2)",
         "v3 = func('3')",
@@ -287,7 +305,8 @@
 
   @Test
   public void testDefaultArguments() throws Exception {
-    eval("def func(a, b = 'b', c = 'c'):",
+    exec(
+        "def func(a, b = 'b', c = 'c'):",
         "  return a + b + c",
         "v1 = func('a', 'x', 'y')",
         "v2 = func(b = 'x', a = 'a', c = 'y')",
@@ -363,7 +382,8 @@
 
   @Test
   public void testDefaultArguments2() throws Exception {
-    eval("a = 2",
+    exec(
+        "a = 2",
         "def foo(x=a): return x",
         "def bar():",
         "  a = 3",
@@ -374,14 +394,16 @@
 
   @Test
   public void testMixingPositionalOptional() throws Exception {
-    eval("def f(name, value = '', optional = ''): return value",
-        "v = f('name', 'value')\n");
+    exec(
+        "def f(name, value = '', optional = ''):", //
+        "  return value",
+        "v = f('name', 'value')");
     assertThat(lookup("v")).isEqualTo("value");
   }
 
   @Test
   public void testStarArg() throws Exception {
-    eval(
+    exec(
         "def f(name, value = '1', optional = '2'): return name + value + optional",
         "v1 = f(*['name', 'value'])",
         "v2 = f('0', *['name', 'value'])",
@@ -395,7 +417,8 @@
 
   @Test
   public void testStarParam() throws Exception {
-    eval("def f(name, value = '1', optional = '2', *rest):",
+    exec(
+        "def f(name, value = '1', optional = '2', *rest):",
         "  r = name + value + optional + '|'",
         "  for x in rest: r += x",
         "  return r",
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/MethodLibraryTest.java b/src/test/java/com/google/devtools/build/lib/syntax/MethodLibraryTest.java
index b6bc1bb..5ca992a 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/MethodLibraryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/MethodLibraryTest.java
@@ -159,10 +159,10 @@
   @Test
   public void testHasAttr() throws Exception {
     new SkylarkTest()
-        .testStatement("hasattr(depset(), 'union')", Boolean.TRUE)
-        .testStatement("hasattr('test', 'count')", Boolean.TRUE)
-        .testStatement("hasattr(dict(a = 1, b = 2), 'items')", Boolean.TRUE)
-        .testStatement("hasattr({}, 'items')", Boolean.TRUE);
+        .testExpression("hasattr(depset(), 'union')", Boolean.TRUE)
+        .testExpression("hasattr('test', 'count')", Boolean.TRUE)
+        .testExpression("hasattr(dict(a = 1, b = 2), 'items')", Boolean.TRUE)
+        .testExpression("hasattr({}, 'items')", Boolean.TRUE);
   }
 
   @Test
@@ -171,8 +171,8 @@
         .testIfExactError(
             "object of type 'string' has no attribute 'not_there'",
             "getattr('a string', 'not_there')")
-        .testStatement("getattr('a string', 'not_there', 'use this')", "use this")
-        .testStatement("getattr('a string', 'not there', None)", Runtime.NONE);
+        .testExpression("getattr('a string', 'not_there', 'use this')", "use this")
+        .testExpression("getattr('a string', 'not there', None)", Runtime.NONE);
   }
 
   @SkylarkModule(name = "AStruct", documented = false, doc = "")
@@ -212,13 +212,13 @@
     String msg = "object of type 'string' has no attribute 'cnt'";
     new SkylarkTest()
         .testIfExactError(msg, "getattr('a string', 'cnt')")
-        .testStatement("getattr('a string', 'cnt', 'default')", "default");
+        .testExpression("getattr('a string', 'cnt', 'default')", "default");
   }
 
   @Test
   public void testDir() throws Exception {
     new SkylarkTest()
-        .testStatement(
+        .testExpression(
             "str(dir({}))",
             "[\"clear\", \"get\", \"items\", \"keys\","
                 + " \"pop\", \"popitem\", \"setdefault\", \"update\", \"values\"]");
@@ -226,7 +226,7 @@
 
   @Test
   public void testBoolean() throws Exception {
-    new BothModesTest().testStatement("False", Boolean.FALSE).testStatement("True", Boolean.TRUE);
+    new BothModesTest().testExpression("False", Boolean.FALSE).testExpression("True", Boolean.TRUE);
   }
 
   @Test
@@ -276,13 +276,13 @@
   public void testDictionaryAccess() throws Exception {
     new BothModesTest()
         .testEval("{1: ['foo']}[1]", "['foo']")
-        .testStatement("{'4': 8}['4']", 8)
-        .testStatement("{'a': 'aa', 'b': 'bb', 'c': 'cc'}['b']", "bb");
+        .testExpression("{'4': 8}['4']", 8)
+        .testExpression("{'a': 'aa', 'b': 'bb', 'c': 'cc'}['b']", "bb");
   }
 
   @Test
   public void testDictionaryVariableAccess() throws Exception {
-    new BothModesTest().setUp("d = {'a' : 1}", "a = d['a']\n").testLookup("a", 1);
+    new BothModesTest().setUp("d = {'a' : 1}", "a = d['a']").testLookup("a", 1);
   }
 
   @Test
@@ -364,11 +364,11 @@
   @Test
   public void testDictionaryGet() throws Exception {
     new BuildTest()
-        .testStatement("{1: 'foo'}.get(1)", "foo")
-        .testStatement("{1: 'foo'}.get(2)", Runtime.NONE)
-        .testStatement("{1: 'foo'}.get(2, 'a')", "a")
-        .testStatement("{1: 'foo'}.get(2, default='a')", "a")
-        .testStatement("{1: 'foo'}.get(2, default=None)", Runtime.NONE);
+        .testExpression("{1: 'foo'}.get(1)", "foo")
+        .testExpression("{1: 'foo'}.get(2)", Runtime.NONE)
+        .testExpression("{1: 'foo'}.get(2, 'a')", "a")
+        .testExpression("{1: 'foo'}.get(2, default='a')", "a")
+        .testExpression("{1: 'foo'}.get(2, default=None)", Runtime.NONE);
   }
 
   @Test
@@ -383,12 +383,11 @@
   @Test
   public void testDictionaryClear() throws Exception {
     new SkylarkTest()
-        .testEval(
-            "d = {1: 'foo', 2: 'bar', 3: 'baz'}\n"
-                + "len(d) == 3 or fail('clear 1')\n"
-                + "d.clear() == None or fail('clear 2')\n"
-                + "d",
-            "{}");
+        .setUp(
+            "d = {1: 'foo', 2: 'bar', 3: 'baz'}",
+            "len(d) == 3 or fail('clear 1')",
+            "d.clear() == None or fail('clear 2')")
+        .testEval("d", "{}");
   }
 
   @Test
@@ -423,36 +422,35 @@
   @Test
   public void testDictionaryUpdate() throws Exception {
     new BothModesTest()
-        .setUp("foo = {'a': 2}")
-        .testEval("foo.update({'b': 4}); foo", "{'a': 2, 'b': 4}");
+        .setUp("foo = {'a': 2}", "foo.update({'b': 4})")
+        .testEval("foo", "{'a': 2, 'b': 4}");
     new BothModesTest()
-        .setUp("foo = {'a': 2}")
-        .testEval("foo.update({'a': 3, 'b': 4}); foo", "{'a': 3, 'b': 4}");
+        .setUp("foo = {'a': 2}", "foo.update({'a': 3, 'b': 4})")
+        .testEval("foo", "{'a': 3, 'b': 4}");
   }
 
   @Test
   public void testDictionarySetDefault() throws Exception {
     new SkylarkTest()
-        .testEval(
-            "d = {2: 'bar', 1: 'foo'}\n"
-                + "len(d) == 2 or fail('setdefault 0')\n"
-                + "d.setdefault(1, 'a') == 'foo' or fail('setdefault 1')\n"
-                + "d.setdefault(2) == 'bar' or fail('setdefault 2')\n"
-                + "d.setdefault(3) == None or fail('setdefault 3')\n"
-                + "d.setdefault(4, 'b') == 'b' or fail('setdefault 4')\n"
-                + "d",
-            "{1: 'foo', 2: 'bar', 3: None, 4: 'b'}");
+        .setUp(
+            "d = {2: 'bar', 1: 'foo'}",
+            "len(d) == 2 or fail('setdefault 0')",
+            "d.setdefault(1, 'a') == 'foo' or fail('setdefault 1')",
+            "d.setdefault(2) == 'bar' or fail('setdefault 2')",
+            "d.setdefault(3) == None or fail('setdefault 3')",
+            "d.setdefault(4, 'b') == 'b' or fail('setdefault 4')")
+        .testEval("d", "{1: 'foo', 2: 'bar', 3: None, 4: 'b'}");
   }
 
   @Test
   public void testListIndexMethod() throws Exception {
     new BothModesTest()
-        .testStatement("['a', 'b', 'c'].index('a')", 0)
-        .testStatement("['a', 'b', 'c'].index('b')", 1)
-        .testStatement("['a', 'b', 'c'].index('c')", 2)
-        .testStatement("[2, 4, 6].index(4)", 1)
-        .testStatement("[2, 4, 6].index(4)", 1)
-        .testStatement("[0, 1, [1]].index([1])", 2)
+        .testExpression("['a', 'b', 'c'].index('a')", 0)
+        .testExpression("['a', 'b', 'c'].index('b')", 1)
+        .testExpression("['a', 'b', 'c'].index('c')", 2)
+        .testExpression("[2, 4, 6].index(4)", 1)
+        .testExpression("[2, 4, 6].index(4)", 1)
+        .testExpression("[0, 1, [1]].index([1])", 2)
         .testIfErrorContains("item \"a\" not found in list", "[1, 2].index('a')")
         .testIfErrorContains("item 0 not found in list", "[].index(0)");
   }
@@ -461,8 +459,8 @@
   public void testHash() throws Exception {
     // We specify the same string hashing algorithm as String.hashCode().
     new SkylarkTest()
-        .testStatement("hash('skylark')", "skylark".hashCode())
-        .testStatement("hash('google')", "google".hashCode())
+        .testExpression("hash('skylark')", "skylark".hashCode())
+        .testExpression("hash('google')", "google".hashCode())
         .testIfErrorContains(
             "expected value of type 'string' for parameter 'value', "
                 + "for call to function hash(value)",
@@ -473,61 +471,61 @@
   public void testRangeType() throws Exception {
     new BothModesTest()
         .setUp("a = range(3)")
-        .testStatement("len(a)", 3)
-        .testStatement("str(a)", "range(0, 3)")
-        .testStatement("str(range(1,2,3))", "range(1, 2, 3)")
-        .testStatement("repr(a)", "range(0, 3)")
-        .testStatement("repr(range(1,2,3))", "range(1, 2, 3)")
-        .testStatement("type(a)", "range")
+        .testExpression("len(a)", 3)
+        .testExpression("str(a)", "range(0, 3)")
+        .testExpression("str(range(1,2,3))", "range(1, 2, 3)")
+        .testExpression("repr(a)", "range(0, 3)")
+        .testExpression("repr(range(1,2,3))", "range(1, 2, 3)")
+        .testExpression("type(a)", "range")
         .testIfErrorContains("unsupported operand type(s) for +: 'range' and 'range'", "a + a")
         .testIfErrorContains("type 'range' has no method append()", "a.append(3)")
-        .testStatement("str(list(range(5)))", "[0, 1, 2, 3, 4]")
-        .testStatement("str(list(range(0)))", "[]")
-        .testStatement("str(list(range(1)))", "[0]")
-        .testStatement("str(list(range(-2)))", "[]")
-        .testStatement("str(list(range(-3, 2)))", "[-3, -2, -1, 0, 1]")
-        .testStatement("str(list(range(3, 2)))", "[]")
-        .testStatement("str(list(range(3, 3)))", "[]")
-        .testStatement("str(list(range(3, 4)))", "[3]")
-        .testStatement("str(list(range(3, 5)))", "[3, 4]")
-        .testStatement("str(list(range(-3, 5, 2)))", "[-3, -1, 1, 3]")
-        .testStatement("str(list(range(-3, 6, 2)))", "[-3, -1, 1, 3, 5]")
-        .testStatement("str(list(range(5, 0, -1)))", "[5, 4, 3, 2, 1]")
-        .testStatement("str(list(range(5, 0, -10)))", "[5]")
-        .testStatement("str(list(range(0, -3, -2)))", "[0, -2]")
-        .testStatement("range(3)[-1]", 2)
+        .testExpression("str(list(range(5)))", "[0, 1, 2, 3, 4]")
+        .testExpression("str(list(range(0)))", "[]")
+        .testExpression("str(list(range(1)))", "[0]")
+        .testExpression("str(list(range(-2)))", "[]")
+        .testExpression("str(list(range(-3, 2)))", "[-3, -2, -1, 0, 1]")
+        .testExpression("str(list(range(3, 2)))", "[]")
+        .testExpression("str(list(range(3, 3)))", "[]")
+        .testExpression("str(list(range(3, 4)))", "[3]")
+        .testExpression("str(list(range(3, 5)))", "[3, 4]")
+        .testExpression("str(list(range(-3, 5, 2)))", "[-3, -1, 1, 3]")
+        .testExpression("str(list(range(-3, 6, 2)))", "[-3, -1, 1, 3, 5]")
+        .testExpression("str(list(range(5, 0, -1)))", "[5, 4, 3, 2, 1]")
+        .testExpression("str(list(range(5, 0, -10)))", "[5]")
+        .testExpression("str(list(range(0, -3, -2)))", "[0, -2]")
+        .testExpression("range(3)[-1]", 2)
         .testIfErrorContains(
             "index out of range (index is 3, but sequence has 3 elements)", "range(3)[3]")
-        .testStatement("str(range(5)[1:])", "range(1, 5)")
-        .testStatement("len(range(5)[1:])", 4)
-        .testStatement("str(range(5)[:2])", "range(0, 2)")
-        .testStatement("str(range(10)[1:9:2])", "range(1, 9, 2)")
-        .testStatement("str(list(range(10)[1:9:2]))", "[1, 3, 5, 7]")
-        .testStatement("str(range(10)[1:10:2])", "range(1, 10, 2)")
-        .testStatement("str(range(10)[1:11:2])", "range(1, 10, 2)")
-        .testStatement("str(range(0, 10, 2)[::2])", "range(0, 10, 4)")
-        .testStatement("str(range(0, 10, 2)[::-2])", "range(8, -2, -4)")
-        .testStatement("str(range(5)[1::-1])", "range(1, -1, -1)")
+        .testExpression("str(range(5)[1:])", "range(1, 5)")
+        .testExpression("len(range(5)[1:])", 4)
+        .testExpression("str(range(5)[:2])", "range(0, 2)")
+        .testExpression("str(range(10)[1:9:2])", "range(1, 9, 2)")
+        .testExpression("str(list(range(10)[1:9:2]))", "[1, 3, 5, 7]")
+        .testExpression("str(range(10)[1:10:2])", "range(1, 10, 2)")
+        .testExpression("str(range(10)[1:11:2])", "range(1, 10, 2)")
+        .testExpression("str(range(0, 10, 2)[::2])", "range(0, 10, 4)")
+        .testExpression("str(range(0, 10, 2)[::-2])", "range(8, -2, -4)")
+        .testExpression("str(range(5)[1::-1])", "range(1, -1, -1)")
         .testIfErrorContains("step cannot be 0", "range(2, 3, 0)")
         .testIfErrorContains("unsupported operand type(s) for *: 'range' and 'int'", "range(3) * 3")
         .testIfErrorContains("Cannot compare range objects", "range(3) < range(5)")
         .testIfErrorContains("Cannot compare range objects", "range(4) > [1]")
-        .testStatement("4 in range(1, 10)", true)
-        .testStatement("4 in range(1, 3)", false)
-        .testStatement("4 in range(0, 8, 2)", true)
-        .testStatement("4 in range(1, 8, 2)", false)
-        .testStatement("range(0, 5, 10) == range(0, 5, 11)", true)
-        .testStatement("range(0, 5, 2) == [0, 2, 4]", false);
+        .testExpression("4 in range(1, 10)", true)
+        .testExpression("4 in range(1, 3)", false)
+        .testExpression("4 in range(0, 8, 2)", true)
+        .testExpression("4 in range(1, 8, 2)", false)
+        .testExpression("range(0, 5, 10) == range(0, 5, 11)", true)
+        .testExpression("range(0, 5, 2) == [0, 2, 4]", false);
   }
 
   @Test
   public void testEnumerate() throws Exception {
     new BothModesTest()
-        .testStatement("str(enumerate([]))", "[]")
-        .testStatement("str(enumerate([5]))", "[(0, 5)]")
-        .testStatement("str(enumerate([5, 3]))", "[(0, 5), (1, 3)]")
-        .testStatement("str(enumerate(['a', 'b', 'c']))", "[(0, \"a\"), (1, \"b\"), (2, \"c\")]")
-        .testStatement("str(enumerate(['a']) + [(1, 'b')])", "[(0, \"a\"), (1, \"b\")]");
+        .testExpression("str(enumerate([]))", "[]")
+        .testExpression("str(enumerate([5]))", "[(0, 5)]")
+        .testExpression("str(enumerate([5, 3]))", "[(0, 5), (1, 3)]")
+        .testExpression("str(enumerate(['a', 'b', 'c']))", "[(0, \"a\"), (1, \"b\"), (2, \"c\")]")
+        .testExpression("str(enumerate(['a']) + [(1, 'b')])", "[(0, \"a\"), (1, \"b\")]");
   }
 
   @Test
@@ -546,17 +544,17 @@
 
   @Test
   public void testLenOnString() throws Exception {
-    new BothModesTest().testStatement("len('abc')", 3);
+    new BothModesTest().testExpression("len('abc')", 3);
   }
 
   @Test
   public void testLenOnList() throws Exception {
-    new BothModesTest().testStatement("len([1,2,3])", 3);
+    new BothModesTest().testExpression("len([1,2,3])", 3);
   }
 
   @Test
   public void testLenOnDict() throws Exception {
-    new BothModesTest().testStatement("len({'a' : 1, 'b' : 2})", 2);
+    new BothModesTest().testExpression("len({'a' : 1, 'b' : 2})", 2);
   }
 
   @Test
@@ -574,40 +572,40 @@
   @Test
   public void testBool() throws Exception {
     new BothModesTest()
-        .testStatement("bool(1)", Boolean.TRUE)
-        .testStatement("bool(0)", Boolean.FALSE)
-        .testStatement("bool([1, 2])", Boolean.TRUE)
-        .testStatement("bool([])", Boolean.FALSE)
-        .testStatement("bool(None)", Boolean.FALSE);
+        .testExpression("bool(1)", Boolean.TRUE)
+        .testExpression("bool(0)", Boolean.FALSE)
+        .testExpression("bool([1, 2])", Boolean.TRUE)
+        .testExpression("bool([])", Boolean.FALSE)
+        .testExpression("bool(None)", Boolean.FALSE);
   }
 
   @Test
   public void testStr() throws Exception {
     new BothModesTest()
-        .testStatement("str(1)", "1")
-        .testStatement("str(-2)", "-2")
-        .testStatement("str([1, 2])", "[1, 2]")
-        .testStatement("str(True)", "True")
-        .testStatement("str(False)", "False")
-        .testStatement("str(None)", "None")
-        .testStatement("str(str)", "<built-in function str>");
+        .testExpression("str(1)", "1")
+        .testExpression("str(-2)", "-2")
+        .testExpression("str([1, 2])", "[1, 2]")
+        .testExpression("str(True)", "True")
+        .testExpression("str(False)", "False")
+        .testExpression("str(None)", "None")
+        .testExpression("str(str)", "<built-in function str>");
   }
 
   @Test
   public void testStrFunction() throws Exception {
-    new SkylarkTest().testStatement("def foo(x): return x\nstr(foo)", "<function foo>");
+    new SkylarkTest().setUp("def foo(x): pass").testExpression("str(foo)", "<function foo>");
   }
 
   @Test
   public void testType() throws Exception {
     new SkylarkTest()
-        .testStatement("type(1)", "int")
-        .testStatement("type('a')", "string")
-        .testStatement("type([1, 2])", "list")
-        .testStatement("type((1, 2))", "tuple")
-        .testStatement("type(True)", "bool")
-        .testStatement("type(None)", "NoneType")
-        .testStatement("type(str)", "function");
+        .testExpression("type(1)", "int")
+        .testExpression("type('a')", "string")
+        .testExpression("type([1, 2])", "list")
+        .testExpression("type((1, 2))", "tuple")
+        .testExpression("type(True)", "bool")
+        .testExpression("type(None)", "NoneType")
+        .testExpression("type(str)", "function");
   }
 
   // TODO(bazel-team): Move this into a new BazelLibraryTest.java file, or at least out of
@@ -615,7 +613,7 @@
   @Test
   public void testSelectFunction() throws Exception {
     enableSkylarkMode();
-    eval("a = select({'a': 1})");
+    exec("a = select({'a': 1})");
     SelectorList result = (SelectorList) lookup("a");
     assertThat(((SelectorValue) Iterables.getOnlyElement(result.getElements())).getDictionary())
         .containsExactly("a", 1);
@@ -624,13 +622,13 @@
   @Test
   public void testZipFunction() throws Exception {
     new BothModesTest()
-        .testStatement("str(zip())", "[]")
-        .testStatement("str(zip([1, 2]))", "[(1,), (2,)]")
-        .testStatement("str(zip([1, 2], ['a', 'b']))", "[(1, \"a\"), (2, \"b\")]")
-        .testStatement("str(zip([1, 2, 3], ['a', 'b']))", "[(1, \"a\"), (2, \"b\")]")
-        .testStatement("str(zip([1], [2], [3]))", "[(1, 2, 3)]")
-        .testStatement("str(zip([1], {2: 'a'}))", "[(1, 2)]")
-        .testStatement("str(zip([1], []))", "[]")
+        .testExpression("str(zip())", "[]")
+        .testExpression("str(zip([1, 2]))", "[(1,), (2,)]")
+        .testExpression("str(zip([1, 2], ['a', 'b']))", "[(1, \"a\"), (2, \"b\")]")
+        .testExpression("str(zip([1, 2, 3], ['a', 'b']))", "[(1, \"a\"), (2, \"b\")]")
+        .testExpression("str(zip([1], [2], [3]))", "[(1, 2, 3)]")
+        .testExpression("str(zip([1], {2: 'a'}))", "[(1, 2)]")
+        .testExpression("str(zip([1], []))", "[]")
         .testIfErrorContains("type 'int' is not iterable", "zip(123)")
         .testIfErrorContains("type 'int' is not iterable", "zip([1], 1)");
   }
@@ -645,16 +643,16 @@
     if (chars == null) {
       new BothModesTest()
           .update("s", input)
-          .testStatement("s.lstrip()", expLeft)
-          .testStatement("s.rstrip()", expRight)
-          .testStatement("s.strip()", expBoth);
+          .testExpression("s.lstrip()", expLeft)
+          .testExpression("s.rstrip()", expRight)
+          .testExpression("s.strip()", expBoth);
     } else {
       new BothModesTest()
           .update("s", input)
           .update("chars", chars)
-          .testStatement("s.lstrip(chars)", expLeft)
-          .testStatement("s.rstrip(chars)", expRight)
-          .testStatement("s.strip(chars)", expBoth);
+          .testExpression("s.lstrip(chars)", expLeft)
+          .testExpression("s.rstrip(chars)", expRight)
+          .testExpression("s.strip(chars)", expBoth);
     }
   }
 
@@ -694,9 +692,9 @@
   @Test
   public void testTupleCoercion() throws Exception {
     new BothModesTest()
-        .testStatement("tuple([1, 2]) == (1, 2)", true)
+        .testExpression("tuple([1, 2]) == (1, 2)", true)
         // Depends on current implementation of dict
-        .testStatement("tuple({1: 'foo', 2: 'bar'}) == (1, 2)", true);
+        .testExpression("tuple({1: 'foo', 2: 'bar'}) == (1, 2)", true);
   }
 
   // Verifies some legacy functionality that should be deprecated and removed via
@@ -706,8 +704,8 @@
   public void testLegacyNamed() throws Exception {
     new SkylarkTest("--incompatible_restrict_named_params=false")
         // Parameters which may be specified by keyword but are not explicitly 'named'.
-        .testStatement("all(elements=[True, True])", Boolean.TRUE)
-        .testStatement("any(elements=[True, False])", Boolean.TRUE)
+        .testExpression("all(elements=[True, True])", Boolean.TRUE)
+        .testExpression("any(elements=[True, False])", Boolean.TRUE)
         .testEval("sorted(self=[3, 0, 2], key=None, reverse=False)", "[0, 2, 3]")
         .testEval("reversed(sequence=[3, 2, 0])", "[0, 2, 3]")
         .testEval("tuple(x=[1, 2])", "(1, 2)")
@@ -715,16 +713,16 @@
         .testEval("len(x=(1, 2))", "2")
         .testEval("str(x=(1, 2))", "'(1, 2)'")
         .testEval("repr(x=(1, 2))", "'(1, 2)'")
-        .testStatement("bool(x=3)", Boolean.TRUE)
+        .testExpression("bool(x=3)", Boolean.TRUE)
         .testEval("int(x=3)", "3")
         .testEval("dict(args=[(1, 2)])", "{1 : 2}")
-        .testStatement("bool(x=3)", Boolean.TRUE)
+        .testExpression("bool(x=3)", Boolean.TRUE)
         .testEval("enumerate(list=[40, 41])", "[(0, 40), (1, 41)]")
-        .testStatement("hash(value='hello')", "hello".hashCode())
+        .testExpression("hash(value='hello')", "hello".hashCode())
         .testEval("range(start_or_stop=3, stop_or_none=9, step=2)", "range(3, 9, 2)")
-        .testStatement("hasattr(x=depset(), name='union')", Boolean.TRUE)
-        .testStatement("bool(x=3)", Boolean.TRUE)
-        .testStatement("getattr(x='hello', name='cnt', default='default')", "default")
+        .testExpression("hasattr(x=depset(), name='union')", Boolean.TRUE)
+        .testExpression("bool(x=3)", Boolean.TRUE)
+        .testExpression("getattr(x='hello', name='cnt', default='default')", "default")
         .testEval(
             "dir(x={})",
             "[\"clear\", \"get\", \"items\", \"keys\","
@@ -733,7 +731,7 @@
         .testEval("str(depset(items=[0,1]))", "'depset([0, 1])'")
         .testIfErrorContains("hello", "fail(msg='hello', attr='someattr')")
         // Parameters which may be None but are not explicitly 'noneable'
-        .testStatement("hasattr(x=None, name='union')", Boolean.FALSE)
+        .testExpression("hasattr(x=None, name='union')", Boolean.FALSE)
         .testEval("getattr(x=None, name='count', default=None)", "None")
         .testEval("dir(None)", "[]")
         .testIfErrorContains("None", "fail(msg=None)")
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java b/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java
index 7b9152a..c34f2d0 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java
@@ -879,7 +879,8 @@
 
   @SuppressWarnings("unchecked")
   private void simpleFlowTest(String statement, int expected) throws Exception {
-    eval("def foo():",
+    exec(
+        "def foo():",
         "  s = 0",
         "  hit = 0",
         "  for i in range(0, 10):",
@@ -904,7 +905,8 @@
   }
 
   private void flowFromDeeperBlock(String statement, int expected) throws Exception {
-    eval("def foo():",
+    exec(
+        "def foo():",
         "   s = 0",
         "   for i in range(0, 10):",
         "       if i % 2 != 0:",
@@ -916,7 +918,8 @@
   }
 
   private void flowFromNestedBlocks(String statement, int expected) throws Exception {
-    eval("def foo2():",
+    exec(
+        "def foo2():",
         "   s = 0",
         "   for i in range(1, 41):",
         "       if i % 2 == 0:",
@@ -942,7 +945,8 @@
   @SuppressWarnings("unchecked")
   private void nestedLoopsTest(String statement, Integer outerExpected, int firstExpected,
       int secondExpected) throws Exception {
-    eval("def foo():",
+    exec(
+        "def foo():",
         "   outer = 0",
         "   first = 0",
         "   second = 0",
@@ -978,7 +982,7 @@
 
   // TODO(adonovan): move this and all tests that use it to Validation tests.
   private void assertValidationError(String expectedError, final String... lines) throws Exception {
-    SyntaxError error = assertThrows(SyntaxError.class, () -> eval(lines));
+    SyntaxError error = assertThrows(SyntaxError.class, () -> exec(lines));
     assertThat(error).hasMessageThat().contains(expectedError);
   }
 
@@ -1016,7 +1020,8 @@
 
   @Test
   public void testReassignment() throws Exception {
-    eval("def foo(x=None):",
+    exec(
+        "def foo(x=None):", //
         "  x = 1",
         "  x = [1, 2]",
         "  x = 'str'",
@@ -1447,7 +1452,8 @@
 
   @Test
   public void testStructAccessOfMethod() throws Exception {
-    new SkylarkTest().update("mock", new Mock()).testStatement("v = mock.function", null);
+    new SkylarkTest().update("mock", new Mock()).testExpression("type(mock.function)", "function");
+    new SkylarkTest().update("mock", new Mock()).testExpression("mock.function()", "a");
   }
 
   @Test
@@ -1495,16 +1501,16 @@
   @Test
   public void testInSetDeprecated() throws Exception {
     new SkylarkTest("--incompatible_depset_is_not_iterable=false")
-        .testStatement("'b' in depset(['a', 'b'])", Boolean.TRUE)
-        .testStatement("'c' in depset(['a', 'b'])", Boolean.FALSE)
-        .testStatement("1 in depset(['a', 'b'])", Boolean.FALSE);
+        .testExpression("'b' in depset(['a', 'b'])", Boolean.TRUE)
+        .testExpression("'c' in depset(['a', 'b'])", Boolean.FALSE)
+        .testExpression("1 in depset(['a', 'b'])", Boolean.FALSE);
   }
 
   @Test
   public void testUnionSet() throws Exception {
     new SkylarkTest("--incompatible_depset_union=false")
-        .testStatement("str(depset([1, 3]) | depset([1, 2]))", "depset([1, 2, 3])")
-        .testStatement("str(depset([1, 2]) | [1, 3])", "depset([1, 2, 3])")
+        .testExpression("str(depset([1, 3]) | depset([1, 2]))", "depset([1, 2, 3])")
+        .testExpression("str(depset([1, 2]) | [1, 3])", "depset([1, 2, 3])")
         .testIfExactError("unsupported operand type(s) for |: 'int' and 'bool'", "2 | False");
   }
 
@@ -1523,13 +1529,13 @@
   @Test
   public void testSetIsIterable() throws Exception {
     new SkylarkTest("--incompatible_depset_is_not_iterable=false")
-        .testStatement("str(list(depset(['a', 'b'])))", "[\"a\", \"b\"]")
-        .testStatement("max(depset([1, 2, 3]))", 3)
-        .testStatement("1 in depset([1, 2, 3])", true)
-        .testStatement("str(sorted(depset(['b', 'a'])))", "[\"a\", \"b\"]")
-        .testStatement("str(tuple(depset(['a', 'b'])))", "(\"a\", \"b\")")
-        .testStatement("str([x for x in depset()])", "[]")
-        .testStatement("len(depset(['a']))", 1);
+        .testExpression("str(list(depset(['a', 'b'])))", "[\"a\", \"b\"]")
+        .testExpression("max(depset([1, 2, 3]))", 3)
+        .testExpression("1 in depset([1, 2, 3])", true)
+        .testExpression("str(sorted(depset(['b', 'a'])))", "[\"a\", \"b\"]")
+        .testExpression("str(tuple(depset(['a', 'b'])))", "(\"a\", \"b\")")
+        .testExpression("str([x for x in depset()])", "[]")
+        .testExpression("len(depset(['a']))", 1);
   }
 
   @Test
@@ -2004,11 +2010,11 @@
   public void testPrint() throws Exception {
     // TODO(fwe): cannot be handled by current testing suite
     setFailFast(false);
-    eval("print('hello')");
+    exec("print('hello')");
     assertContainsDebug("hello");
-    eval("print('a', 'b')");
+    exec("print('a', 'b')");
     assertContainsDebug("a b");
-    eval("print('a', 'b', sep='x')");
+    exec("print('a', 'b', sep='x')");
     assertContainsDebug("axb");
   }
 
@@ -2081,9 +2087,11 @@
   @Override
   @Test
   public void testNotCallInt() throws Exception {
-    new SkylarkTest().setUp("sum = 123456").testLookup("sum", 123456)
+    new SkylarkTest()
+        .setUp("sum = 123456")
+        .testLookup("sum", 123456)
         .testIfExactError("'int' object is not callable", "sum(1, 2, 3, 4, 5, 6)")
-        .testStatement("sum", 123456);
+        .testExpression("sum", 123456);
   }
 
   @Test
@@ -2093,8 +2101,9 @@
 
   @Test
   public void testConditionalExpressionInFunction() throws Exception {
-    new SkylarkTest().setUp("def foo(a, b, c): return a+b if c else a-b\n").testStatement(
-        "foo(23, 5, 0)", 18);
+    new SkylarkTest()
+        .setUp("def foo(a, b, c): return a+b if c else a-b\n")
+        .testExpression("foo(23, 5, 0)", 18);
   }
 
   @SkylarkModule(name = "SkylarkClassObjectWithSkylarkCallables", doc = "")
@@ -2211,7 +2220,12 @@
 
   @Test
   public void testListComprehensionsShadowGlobalVariable() throws Exception {
-    eval("a = 18", "def foo():", "  b = [a for a in range(3)]", "  return a", "x = foo()");
+    exec(
+        "a = 18", //
+        "def foo():",
+        "  b = [a for a in range(3)]",
+        "  return a",
+        "x = foo()");
     assertThat(lookup("x")).isEqualTo(18);
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/SkylarkListTest.java b/src/test/java/com/google/devtools/build/lib/syntax/SkylarkListTest.java
index f02b15c..a566f15 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/SkylarkListTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/SkylarkListTest.java
@@ -34,12 +34,12 @@
 
   @Test
   public void testIndex() throws Exception {
-    eval("l = [1, '2', 3]");
+    exec("l = [1, '2', 3]");
     assertThat(eval("l[0]")).isEqualTo(1);
     assertThat(eval("l[1]")).isEqualTo("2");
     assertThat(eval("l[2]")).isEqualTo(3);
 
-    eval("t = (1, '2', 3)");
+    exec("t = (1, '2', 3)");
     assertThat(eval("t[0]")).isEqualTo(1);
     assertThat(eval("t[1]")).isEqualTo("2");
     assertThat(eval("t[2]")).isEqualTo(3);
@@ -56,7 +56,7 @@
 
   @Test
   public void testNegativeIndices() throws Exception {
-    eval("l = ['a', 'b', 'c']");
+    exec("l = ['a', 'b', 'c']");
     assertThat(eval("l[0]")).isEqualTo("a");
     assertThat(eval("l[-1]")).isEqualTo("c");
     assertThat(eval("l[-2]")).isEqualTo("b");
@@ -72,7 +72,7 @@
 
   @Test
   public void testSlice() throws Exception {
-    eval("l = ['a', 'b', 'c']");
+    exec("l = ['a', 'b', 'c']");
     assertThat(listEval("l[0:3]")).containsExactly("a", "b", "c").inOrder();
     assertThat(listEval("l[0:2]")).containsExactly("a", "b").inOrder();
     assertThat(listEval("l[0:1]")).containsExactly("a").inOrder();
@@ -83,14 +83,14 @@
     assertThat(listEval("l[2:1]")).isEmpty();
     assertThat(listEval("l[3:0]")).isEmpty();
 
-    eval("t = ('a', 'b', 'c')");
+    exec("t = ('a', 'b', 'c')");
     assertThat(listEval("t[0:3]")).containsExactly("a", "b", "c").inOrder();
     assertThat(listEval("t[1:2]")).containsExactly("b").inOrder();
   }
 
   @Test
   public void testSliceDefault() throws Exception {
-    eval("l = ['a', 'b', 'c']");
+    exec("l = ['a', 'b', 'c']");
     assertThat(listEval("l[:]")).containsExactly("a", "b", "c").inOrder();
     assertThat(listEval("l[:2]")).containsExactly("a", "b").inOrder();
     assertThat(listEval("l[2:]")).containsExactly("c").inOrder();
@@ -98,7 +98,7 @@
 
   @Test
   public void testSliceNegative() throws Exception {
-    eval("l = ['a', 'b', 'c']");
+    exec("l = ['a', 'b', 'c']");
     assertThat(listEval("l[-2:-1]")).containsExactly("b").inOrder();
     assertThat(listEval("l[-2:]")).containsExactly("b", "c").inOrder();
     assertThat(listEval("l[0:-1]")).containsExactly("a", "b").inOrder();
@@ -107,7 +107,7 @@
 
   @Test
   public void testSliceBounds() throws Exception {
-    eval("l = ['a', 'b', 'c']");
+    exec("l = ['a', 'b', 'c']");
     assertThat(listEval("l[0:5]")).containsExactly("a", "b", "c").inOrder();
     assertThat(listEval("l[-10:2]")).containsExactly("a", "b").inOrder();
     assertThat(listEval("l[3:10]")).isEmpty();
@@ -116,7 +116,7 @@
 
   @Test
   public void testSliceSkip() throws Exception {
-    eval("l = ['a', 'b', 'c', 'd', 'e', 'f', 'g']");
+    exec("l = ['a', 'b', 'c', 'd', 'e', 'f', 'g']");
     assertThat(listEval("l[0:6:2]")).containsExactly("a", "c", "e").inOrder();
     assertThat(listEval("l[0:7:2]")).containsExactly("a", "c", "e", "g").inOrder();
     assertThat(listEval("l[0:10:2]")).containsExactly("a", "c", "e", "g").inOrder();
@@ -129,7 +129,7 @@
 
   @Test
   public void testSliceNegativeSkip() throws Exception {
-    eval("l = ['a', 'b', 'c', 'd', 'e', 'f', 'g']");
+    exec("l = ['a', 'b', 'c', 'd', 'e', 'f', 'g']");
     assertThat(listEval("l[5:2:-1]")).containsExactly("f", "e", "d").inOrder();
     assertThat(listEval("l[5:2:-2]")).containsExactly("f", "d").inOrder();
     assertThat(listEval("l[5:3:-2]")).containsExactly("f").inOrder();
@@ -164,7 +164,8 @@
 
   @Test
   public void testConcatListIndex() throws Exception {
-    eval("l = [1, 2] + [3, 4]",
+    exec(
+        "l = [1, 2] + [3, 4]", //
         "e0 = l[0]",
         "e1 = l[1]",
         "e2 = l[2]",
@@ -177,12 +178,13 @@
 
   @Test
   public void testConcatListHierarchicalIndex() throws Exception {
-    eval("l = [1] + (([2] + [3, 4]) + [5])",
-         "e0 = l[0]",
-         "e1 = l[1]",
-         "e2 = l[2]",
-         "e3 = l[3]",
-         "e4 = l[4]");
+    exec(
+        "l = [1] + (([2] + [3, 4]) + [5])", //
+        "e0 = l[0]",
+        "e1 = l[1]",
+        "e2 = l[2]",
+        "e3 = l[3]",
+        "e4 = l[4]");
     assertThat(lookup("e0")).isEqualTo(1);
     assertThat(lookup("e1")).isEqualTo(2);
     assertThat(lookup("e2")).isEqualTo(3);
@@ -197,34 +199,32 @@
 
   @Test
   public void testAppend() throws Exception {
-    eval("l = [1, 2]");
+    exec("l = [1, 2]");
     assertThat(Runtime.NONE).isEqualTo(eval("l.append([3, 4])"));
     assertThat(eval("[1, 2, [3, 4]]")).isEqualTo(lookup("l"));
   }
 
   @Test
   public void testExtend() throws Exception {
-    eval("l = [1, 2]");
+    exec("l = [1, 2]");
     assertThat(Runtime.NONE).isEqualTo(eval("l.extend([3, 4])"));
     assertThat(eval("[1, 2, 3, 4]")).isEqualTo(lookup("l"));
   }
 
   @Test
   public void testConcatListToString() throws Exception {
-    eval("l = [1, 2] + [3, 4]",
-         "s = str(l)");
-    assertThat(lookup("s")).isEqualTo("[1, 2, 3, 4]");
+    assertThat(eval("str([1, 2] + [3, 4])")).isEqualTo("[1, 2, 3, 4]");
   }
 
   @Test
   public void testConcatListNotEmpty() throws Exception {
-    eval("l = [1, 2] + [3, 4]", "v = 1 if l else 0");
+    exec("l = [1, 2] + [3, 4]", "v = 1 if l else 0");
     assertThat(lookup("v")).isEqualTo(1);
   }
 
   @Test
   public void testConcatListEmpty() throws Exception {
-    eval("l = [] + []", "v = 1 if l else 0");
+    exec("l = [] + []", "v = 1 if l else 0");
     assertThat(lookup("v")).isEqualTo(0);
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/SkylarkNestedSetTest.java b/src/test/java/com/google/devtools/build/lib/syntax/SkylarkNestedSetTest.java
index 6318768..e737188 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/SkylarkNestedSetTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/SkylarkNestedSetTest.java
@@ -38,13 +38,13 @@
 
   @Test
   public void testConstructor() throws Exception {
-    eval("s = depset(order='default')");
+    exec("s = depset(order='default')");
     assertThat(lookup("s")).isInstanceOf(SkylarkNestedSet.class);
   }
 
   @Test
   public void testTuplePairs() throws Exception {
-    eval(
+    exec(
         // Depsets with tuple-pairs
         "s_one = depset([('1', '2'), ('3', '4')])",
         "s_two = depset(direct = [('1', '2'), ('3', '4'), ('5', '6')])",
@@ -78,7 +78,7 @@
 
   @Test
   public void testGetSet() throws Exception {
-    eval("s = depset(['a', 'b'])");
+    exec("s = depset(['a', 'b'])");
     assertThat(get("s").getSet(String.class)).containsExactly("a", "b").inOrder();
     assertThat(get("s").getSet(Object.class)).containsExactly("a", "b").inOrder();
     assertThrows(SkylarkNestedSet.TypeException.class, () -> get("s").getSet(Integer.class));
@@ -86,7 +86,7 @@
 
   @Test
   public void testGetSetDirect() throws Exception {
-    eval("s = depset(direct = ['a', 'b'])");
+    exec("s = depset(direct = ['a', 'b'])");
     assertThat(get("s").getSet(String.class)).containsExactly("a", "b").inOrder();
     assertThat(get("s").getSet(Object.class)).containsExactly("a", "b").inOrder();
     assertThrows(SkylarkNestedSet.TypeException.class, () -> get("s").getSet(Integer.class));
@@ -94,7 +94,7 @@
 
   @Test
   public void testGetSetItems() throws Exception {
-    eval("s = depset(items = ['a', 'b'])");
+    exec("s = depset(items = ['a', 'b'])");
     assertThat(get("s").getSet(String.class)).containsExactly("a", "b").inOrder();
     assertThat(get("s").getSet(Object.class)).containsExactly("a", "b").inOrder();
     assertThrows(SkylarkNestedSet.TypeException.class, () -> get("s").getSet(Integer.class));
@@ -103,7 +103,7 @@
 
   @Test
   public void testToCollection() throws Exception {
-    eval("s = depset(['a', 'b'])");
+    exec("s = depset(['a', 'b'])");
     assertThat(get("s").toCollection(String.class)).containsExactly("a", "b").inOrder();
     assertThat(get("s").toCollection(Object.class)).containsExactly("a", "b").inOrder();
     assertThat(get("s").toCollection()).containsExactly("a", "b").inOrder();
@@ -112,7 +112,7 @@
 
   @Test
   public void testToCollectionDirect() throws Exception {
-    eval("s = depset(direct = ['a', 'b'])");
+    exec("s = depset(direct = ['a', 'b'])");
     assertThat(get("s").toCollection(String.class)).containsExactly("a", "b").inOrder();
     assertThat(get("s").toCollection(Object.class)).containsExactly("a", "b").inOrder();
     assertThat(get("s").toCollection()).containsExactly("a", "b").inOrder();
@@ -121,7 +121,7 @@
 
   @Test
   public void testToCollectionItems() throws Exception {
-    eval("s = depset(items = ['a', 'b'])");
+    exec("s = depset(items = ['a', 'b'])");
     assertThat(get("s").toCollection(String.class)).containsExactly("a", "b").inOrder();
     assertThat(get("s").toCollection(Object.class)).containsExactly("a", "b").inOrder();
     assertThat(get("s").toCollection()).containsExactly("a", "b").inOrder();
@@ -130,19 +130,19 @@
 
   @Test
   public void testOrder() throws Exception {
-    eval("s = depset(['a', 'b'], order='postorder')");
+    exec("s = depset(['a', 'b'], order='postorder')");
     assertThat(get("s").getSet(String.class).getOrder()).isEqualTo(Order.COMPILE_ORDER);
   }
 
   @Test
   public void testOrderDirect() throws Exception {
-    eval("s = depset(direct = ['a', 'b'], order='postorder')");
+    exec("s = depset(direct = ['a', 'b'], order='postorder')");
     assertThat(get("s").getSet(String.class).getOrder()).isEqualTo(Order.COMPILE_ORDER);
   }
 
   @Test
   public void testOrderItems() throws Exception {
-    eval("s = depset(items = ['a', 'b'], order='postorder')");
+    exec("s = depset(items = ['a', 'b'], order='postorder')");
     assertThat(get("s").getSet(String.class).getOrder()).isEqualTo(Order.COMPILE_ORDER);
   }
 
@@ -169,31 +169,31 @@
 
   @Test
   public void testEmptyGenericType() throws Exception {
-    eval("s = depset()");
+    exec("s = depset()");
     assertThat(get("s").getContentType()).isEqualTo(SkylarkType.TOP);
   }
 
   @Test
   public void testHomogeneousGenericType() throws Exception {
-    eval("s = depset(['a', 'b', 'c'])");
+    exec("s = depset(['a', 'b', 'c'])");
     assertThat(get("s").getContentType()).isEqualTo(SkylarkType.of(String.class));
   }
 
   @Test
   public void testHomogeneousGenericTypeDirect() throws Exception {
-    eval("s = depset(['a', 'b', 'c'], transitive = [])");
+    exec("s = depset(['a', 'b', 'c'], transitive = [])");
     assertThat(get("s").getContentType()).isEqualTo(SkylarkType.of(String.class));
   }
 
   @Test
   public void testHomogeneousGenericTypeItems() throws Exception {
-    eval("s = depset(items = ['a', 'b', 'c'], transitive = [])");
+    exec("s = depset(items = ['a', 'b', 'c'], transitive = [])");
     assertThat(get("s").getContentType()).isEqualTo(SkylarkType.of(String.class));
   }
 
   @Test
   public void testHomogeneousGenericTypeTransitive() throws Exception {
-    eval("s = depset(['a', 'b', 'c'], transitive = [depset(['x'])])");
+    exec("s = depset(['a', 'b', 'c'], transitive = [depset(['x'])])");
     assertThat(get("s").getContentType()).isEqualTo(SkylarkType.of(String.class));
   }
 
@@ -333,7 +333,7 @@
   @Test
   public void testUnionOrder() throws Exception {
     thread = newStarlarkThreadWithSkylarkOptions("--incompatible_depset_union=false");
-    eval(
+    exec(
         "def func():",
         "  s1 = depset()",
         "  s2 = depset()",
@@ -372,7 +372,7 @@
   @Test
   public void testUnionNoSideEffects() throws Exception {
     thread = newStarlarkThreadWithSkylarkOptions("--incompatible_depset_union=false");
-    eval(
+    exec(
         "def func():",
         "  s1 = depset(['a'])",
         "  s2 = s1.union(['b'])",
@@ -384,8 +384,8 @@
   @Test
   public void testFunctionReturnsDepset() throws Exception {
     thread = newStarlarkThreadWithSkylarkOptions("--incompatible_depset_union=false");
-    eval(
-        "def func():",
+    exec(
+        "def func():", //
         "  t = depset()",
         "  t += ['a']",
         "  return t",
@@ -397,8 +397,8 @@
   @Test
   public void testPlusEqualsWithList() throws Exception {
     thread = newStarlarkThreadWithSkylarkOptions("--incompatible_depset_union=false");
-    eval(
-        "def func():",
+    exec(
+        "def func():", //
         "  t = depset()",
         "  t += ['a', 'b']",
         "  return t",
@@ -409,7 +409,7 @@
   @Test
   public void testPlusEqualsNoSideEffects() throws Exception {
     thread = newStarlarkThreadWithSkylarkOptions("--incompatible_depset_union=false");
-    eval(
+    exec(
         "def func():",
         "  s1 = depset()",
         "  s1 += ['a']",
@@ -423,7 +423,7 @@
   @Test
   public void testFuncParamNoSideEffects() throws Exception {
     thread = newStarlarkThreadWithSkylarkOptions("--incompatible_depset_union=false");
-    eval(
+    exec(
         "def func1(t):",
         "  t += ['b']",
         "def func2():",
@@ -438,7 +438,7 @@
   @Test
   public void testTransitiveOrdering() throws Exception {
     thread = newStarlarkThreadWithSkylarkOptions("--incompatible_depset_union=false");
-    eval(
+    exec(
         "def func():",
         "  sa = depset(['a'], order='postorder')",
         "  sb = depset(['b'], order='postorder')",
@@ -452,7 +452,7 @@
   @Test
   public void testLeftRightDirectOrdering() throws Exception {
     thread = newStarlarkThreadWithSkylarkOptions("--incompatible_depset_union=false");
-    eval(
+    exec(
         "def func():",
         "  t = depset()",
         "  t += [4]",
@@ -467,8 +467,8 @@
   @Test
   public void testToString() throws Exception {
     thread = newStarlarkThreadWithSkylarkOptions("--incompatible_depset_union=false");
-    eval(
-        "s = depset() + [2, 4, 6] + [3, 4, 5]",
+    exec(
+        "s = depset() + [2, 4, 6] + [3, 4, 5]", //
         "x = str(s)");
     assertThat(lookup("x")).isEqualTo("depset([2, 4, 6, 3, 5])");
   }
@@ -476,8 +476,8 @@
   @Test
   public void testToStringWithOrder() throws Exception {
     thread = newStarlarkThreadWithSkylarkOptions("--incompatible_depset_union=false");
-    eval(
-        "s = depset(order = 'topological') + [2, 4, 6] + [3, 4, 5]",
+    exec(
+        "s = depset(order = 'topological') + [2, 4, 6] + [3, 4, 5]", //
         "x = str(s)");
     assertThat(lookup("x")).isEqualTo("depset([2, 4, 6, 3, 5], order = \"topological\")");
   }
@@ -490,8 +490,8 @@
   @Test
   public void testToList() throws Exception {
     thread = newStarlarkThreadWithSkylarkOptions("--incompatible_depset_union=false");
-    eval(
-        "s = depset() + [2, 4, 6] + [3, 4, 5]",
+    exec(
+        "s = depset() + [2, 4, 6] + [3, 4, 5]", //
         "x = s.to_list()");
     Object value = lookup("x");
     assertThat(value).isInstanceOf(MutableList.class);
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/StarlarkThreadTest.java b/src/test/java/com/google/devtools/build/lib/syntax/StarlarkThreadTest.java
index fbfd192..86d5789 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/StarlarkThreadTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/StarlarkThreadTest.java
@@ -55,7 +55,7 @@
   @Test
   public void testAssign() throws Exception {
     assertThat(lookup("foo")).isNull();
-    eval("foo = 'bar'");
+    exec("foo = 'bar'");
     assertThat(lookup("foo")).isEqualTo("bar");
   }
 
@@ -74,7 +74,7 @@
   public void testAssignAndReference() throws Exception {
     SyntaxError e = assertThrows(SyntaxError.class, () -> eval("foo"));
     assertThat(e).hasMessageThat().isEqualTo("name 'foo' is not defined");
-    eval("foo = 'bar'");
+    exec("foo = 'bar'");
     assertThat(eval("foo")).isEqualTo("bar");
   }
 
@@ -188,7 +188,7 @@
   @Test
   public void testBuiltinsCanBeShadowed() throws Exception {
     StarlarkThread thread = newStarlarkThreadWithSkylarkOptions().setup("special_var", 42);
-    EvalUtils.execOrEval(ParserInput.fromLines("special_var = 41"), thread);
+    EvalUtils.exec(ParserInput.fromLines("special_var = 41"), thread);
     assertThat(thread.moduleLookup("special_var")).isEqualTo(41);
   }
 
@@ -196,8 +196,10 @@
   public void testVariableIsReferencedBeforeAssignment() throws Exception {
     StarlarkThread thread = newStarlarkThread().update("global_var", 666);
     try {
-      EvalUtils.execOrEval(
-          ParserInput.fromLines("def foo(x): x += global_var; global_var = 36; return x", "foo(1)"),
+      EvalUtils.exec(
+          ParserInput.fromLines(
+              "def foo(x): x += global_var; global_var = 36; return x", //
+              "foo(1)"),
           thread);
       throw new AssertionError("failed to fail");
     } catch (EvalExceptionWithStackTrace e) {
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/util/EvaluationTestCase.java b/src/test/java/com/google/devtools/build/lib/syntax/util/EvaluationTestCase.java
index d1edd73..c44d1ff 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/util/EvaluationTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/util/EvaluationTestCase.java
@@ -17,7 +17,6 @@
 import static org.junit.Assert.fail;
 
 import com.google.common.collect.ImmutableMap;
-import com.google.common.truth.Ordered;
 import com.google.devtools.build.lib.events.Event;
 import com.google.devtools.build.lib.events.EventCollector;
 import com.google.devtools.build.lib.events.EventKind;
@@ -167,14 +166,20 @@
     return thread.moduleLookup(varname);
   }
 
-  // TODO(adonovan): this function does far too much:
-  // - two forms, exec(file) or exec(file)+eval(expression).
+  /** Joins the lines, parses them as an expression, and evaluates it. */
+  public final Object eval(String... lines) throws Exception {
+    ParserInput input = ParserInput.fromLines(lines);
+    return EvalUtils.eval(input, thread);
+  }
+
+  /** Joins the lines, parses them as a file, and executes it. */
+  // TODO(adonovan): this function does too much:
   // - two modes, BUILD vs Skylark.
   // - parse + validate + BUILD dialect checks + execute.
   // Break the tests down into tests of just the scanner, parser, validator, build dialect checks,
   // or execution, and assert that all passes except the one of interest succeed.
   // All BUILD-dialect stuff belongs in bazel proper (lib.packages), not here.
-  public Object eval(String... lines) throws Exception {
+  public final void exec(String... lines) throws Exception {
     ParserInput input = ParserInput.fromLines(lines);
     StarlarkFile file = StarlarkFile.parse(input);
     ValidationEnvironment.validateFile(
@@ -189,12 +194,12 @@
       Event.replayEventsOn(getEventHandler(), file.errors());
       PackageFactory.checkBuildSyntax(file, getEventHandler());
     }
-    return EvalUtils.execOrEval(file, thread);
+    EvalUtils.exec(file, thread);
   }
 
   public void checkEvalError(String msg, String... input) throws Exception {
     try {
-      eval(input);
+      exec(input);
       fail("Expected error '" + msg + "' but got no error");
     } catch (SyntaxError | EvalException | EventCollectionApparatus.FailFastException e) {
       assertThat(e).hasMessageThat().isEqualTo(msg);
@@ -203,7 +208,7 @@
 
   public void checkEvalErrorContains(String msg, String... input) throws Exception {
     try {
-      eval(input);
+      exec(input);
       fail("Expected error containing '" + msg + "' but got no error");
     } catch (SyntaxError | EvalException | EventCollectionApparatus.FailFastException e) {
       assertThat(e).hasMessageThat().contains(msg);
@@ -212,7 +217,7 @@
 
   public void checkEvalErrorDoesNotContain(String msg, String... input) throws Exception {
     try {
-      eval(input);
+      exec(input);
     } catch (SyntaxError | EvalException | EventCollectionApparatus.FailFastException e) {
       assertThat(e).hasMessageThat().doesNotContain(msg);
     }
@@ -267,13 +272,9 @@
       setup = new SetupActions();
     }
 
-    /**
-     * Allows the execution of several statements before each following test
-     * @param statements The statement(s) to be executed
-     * @return This {@code ModalTestCase}
-     */
-    public ModalTestCase setUp(String... statements) {
-      setup.registerEval(statements);
+    /** Allows the execution of several statements before each following test. */
+    public ModalTestCase setUp(String... lines) {
+      setup.registerExec(lines);
       return this;
     }
 
@@ -289,153 +290,97 @@
     }
 
     /**
-     * Evaluates two parameters and compares their results.
-     * @param statement The statement to be evaluated
+     * Evaluates two expressions and asserts that their results are equal.
+     *
+     * @param src The source expression to be evaluated
      * @param expectedEvalString The expression of the expected result
      * @return This {@code ModalTestCase}
      * @throws Exception
      */
-    public ModalTestCase testEval(String statement, String expectedEvalString) throws Exception {
-      runTest(createComparisonTestable(statement, expectedEvalString, true));
+    public ModalTestCase testEval(String src, String expectedEvalString) throws Exception {
+      runTest(createComparisonTestable(src, expectedEvalString, true));
       return this;
     }
 
-    /**
-     * Evaluates the given statement and compares its result to the expected object
-     * @param statement
-     * @param expected
-     * @return This {@code ModalTestCase}
-     * @throws Exception
-     */
-    public ModalTestCase testStatement(String statement, Object expected) throws Exception {
-      runTest(createComparisonTestable(statement, expected, false));
+    /** Evaluates an expression and compares its result to the expected object. */
+    public ModalTestCase testExpression(String src, Object expected) throws Exception {
+      runTest(createComparisonTestable(src, expected, false));
       return this;
     }
 
-    /**
-     * Evaluates the given statement and compares its result to the collection of expected objects
-     * without considering their order
-     * @param statement The statement to be evaluated
-     * @param items The expected items
-     * @return This {@code ModalTestCase}
-     * @throws Exception
-     */
-    public ModalTestCase testCollection(String statement, Object... items) throws Exception {
-      runTest(collectionTestable(statement, false, items));
+    /** Evaluates an expression and compares its result to the ordered list of expected objects. */
+    public ModalTestCase testExactOrder(String src, Object... items) throws Exception {
+      runTest(collectionTestable(src, items));
       return this;
     }
 
-    /**
-     * Evaluates the given statement and compares its result to the collection of expected objects
-     * while considering their order
-     * @param statement The statement to be evaluated
-     * @param items The expected items, in order
-     * @return This {@code ModalTestCase}
-     * @throws Exception
-     */
-    public ModalTestCase testExactOrder(String statement, Object... items) throws Exception {
-      runTest(collectionTestable(statement, true, items));
+    /** Evaluates an expression and checks whether it fails with the expected error. */
+    public ModalTestCase testIfExactError(String expectedError, String... lines) throws Exception {
+      runTest(errorTestable(true, expectedError, lines));
       return this;
     }
 
-    /**
-     * Evaluates the given statement and checks whether the given error message appears
-     * @param expectedError The expected error message
-     * @param statements The statement(s) to be evaluated
-     * @return This ModalTestCase
-     * @throws Exception
-     */
-    public ModalTestCase testIfExactError(String expectedError, String... statements)
+    /** Evaluates the expresson and checks whether it fails with the expected error. */
+    public ModalTestCase testIfErrorContains(String expectedError, String... lines)
         throws Exception {
-      runTest(errorTestable(true, expectedError, statements));
+      runTest(errorTestable(false, expectedError, lines));
       return this;
     }
 
-    /**
-     * Evaluates the given statement and checks whether an error that contains the expected message
-     * occurs
-     * @param expectedError
-     * @param statements
-     * @return This ModalTestCase
-     * @throws Exception
-     */
-    public ModalTestCase testIfErrorContains(String expectedError, String... statements)
-        throws Exception {
-      runTest(errorTestable(false, expectedError, statements));
-      return this;
-    }
-
-    /**
-     * Looks up the value of the specified variable and compares it to the expected value
-     * @param name
-     * @param expected
-     * @return This ModalTestCase
-     * @throws Exception
-     */
+    /** Looks up the value of the specified variable and compares it to the expected value. */
     public ModalTestCase testLookup(String name, Object expected) throws Exception {
       runTest(createLookUpTestable(name, expected));
       return this;
     }
 
     /**
-     * Creates a Testable that checks whether the evaluation of the given statement leads to the
-     * expected error
-     * @param statements
-     * @param error
-     * @param exactMatch If true, the error message has to be identical to the expected error
-     * @return An instance of Testable that runs the error check
+     * Creates a Testable that checks whether the evaluation of the given expression fails with the
+     * expected error.
+     *
+     * @param exactMatch whether the error message must be identical to the expected error.
      */
     protected Testable errorTestable(
-        final boolean exactMatch, final String error, final String... statements) {
+        final boolean exactMatch, final String error, final String... lines) {
       return new Testable() {
         @Override
         public void run() throws Exception {
           if (exactMatch) {
-            checkEvalError(error, statements);
+            checkEvalError(error, lines);
           } else {
-            checkEvalErrorContains(error, statements);
+            checkEvalErrorContains(error, lines);
           }
         }
       };
     }
 
     /**
-     * Creates a testable that checks whether the evaluation of the given statement leads to a list
-     * that contains exactly the expected objects
-     * @param statement The statement to be evaluated
-     * @param ordered Determines whether the order of the elements is checked as well
-     * @param expected Expected objects
-     * @return An instance of Testable that runs the check
+     * Creates a Testable that checks whether the value of the expression is a sequence containing
+     * the expected elements.
      */
-    protected Testable collectionTestable(
-        final String statement, final boolean ordered, final Object... expected) {
+    protected Testable collectionTestable(final String src, final Object... expected) {
       return new Testable() {
         @Override
         public void run() throws Exception {
-          Ordered tmp = assertThat((Iterable<?>) eval(statement)).containsExactly(expected);
-
-          if (ordered) {
-            tmp.inOrder();
-          }
+          assertThat((Iterable<?>) eval(src)).containsExactly(expected).inOrder();
         }
       };
     }
 
     /**
-     * Creates a testable that compares the evaluation of the given statement to a specified result
+     * Creates a testable that compares the value of the expression to a specified result.
      *
-     * @param statement The statement to be evaluated
+     * @param src The expression to be evaluated
      * @param expected Either the expected object or an expression whose evaluation leads to the
-     *  expected object
+     *     expected object
      * @param expectedIsExpression Signals whether {@code expected} is an object or an expression
      * @return An instance of Testable that runs the comparison
      */
     protected Testable createComparisonTestable(
-        final String statement, final Object expected, final boolean expectedIsExpression) {
+        final String src, final Object expected, final boolean expectedIsExpression) {
       return new Testable() {
         @Override
         public void run() throws Exception {
-          Object actual = eval(statement);
+          Object actual = eval(src);
           Object realExpected = expected;
 
           // We could also print the actual object and compare the string to the expected
@@ -525,17 +470,13 @@
           });
     }
 
-    /**
-     * Registers a statement for evaluation prior to a test
-     *
-     * @param statements
-     */
-    public void registerEval(final String... statements) {
+    /** Registers a sequence of statements for execution prior to a test. */
+    public void registerExec(final String... lines) {
       setup.add(
           new Testable() {
             @Override
             public void run() throws Exception {
-              EvaluationTestCase.this.eval(statements);
+              EvaluationTestCase.this.exec(lines);
             }
           });
     }
