diff --git a/src/test/java/com/google/devtools/build/lib/syntax/AbstractParserTestCase.java b/src/test/java/com/google/devtools/build/lib/syntax/AbstractParserTestCase.java
index ba59864..cba1bd6 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/AbstractParserTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/AbstractParserTestCase.java
@@ -20,14 +20,12 @@
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.lib.vfs.util.FsApparatus;
 
-import junit.framework.TestCase;
-
 import java.util.List;
 
 /**
  * Base class for test cases that use parsing services.
  */
-public abstract class AbstractParserTestCase extends TestCase {
+public abstract class AbstractParserTestCase {
   public static final class EmptyPackageLocator implements CachingPackageLocator {
     @Override
     public Path getBuildFileForPackage(String packageName) {
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/EnvironmentTest.java b/src/test/java/com/google/devtools/build/lib/syntax/EnvironmentTest.java
index 0452913..daa849b 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/EnvironmentTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/EnvironmentTest.java
@@ -14,14 +14,23 @@
 
 package com.google.devtools.build.lib.syntax;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
 import com.google.common.collect.Sets;
 
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
 /**
  * Tests of Environment.
  */
+@RunWith(JUnit4.class)
 public class EnvironmentTest extends AbstractEvaluationTestCase {
 
   // Test the API directly
+  @Test
   public void testLookupAndUpdate() throws Exception {
     Environment env = new Environment();
 
@@ -37,6 +46,7 @@
     assertEquals("bar", env.lookup("foo"));
   }
 
+  @Test
   public void testLookupWithDefault() throws Exception {
     Environment env = new Environment();
     assertEquals(21, env.lookup("VERSION", 21));
@@ -44,6 +54,7 @@
     assertEquals(42, env.lookup("VERSION", 21));
   }
 
+  @Test
   public void testDoubleUpdateSucceeds() throws Exception {
     Environment env = new Environment();
     env.update("VERSION", 42);
@@ -53,6 +64,7 @@
   }
 
   // Test assign through interpreter, lookup through API:
+  @Test
   public void testAssign() throws Exception {
     Environment env = new Environment();
 
@@ -69,6 +81,7 @@
   }
 
   // Test update through API, reference through interpreter:
+  @Test
   public void testReference() throws Exception {
     Environment env = new Environment();
 
@@ -85,6 +98,7 @@
   }
 
   // Test assign and reference through interpreter:
+  @Test
   public void testAssignAndReference() throws Exception {
     Environment env = new Environment();
 
@@ -100,6 +114,7 @@
     assertEquals("bar", eval(parseExpr("foo"), env));
   }
 
+  @Test
   public void testGetVariableNames() throws Exception {
     Environment env = new Environment();
     env.update("foo", "bar");
@@ -114,6 +129,7 @@
         nestedEnv.getVariableNames());
   }
 
+  @Test
   public void testToString() throws Exception {
     Environment env = new Environment();
     env.update("subject", new StringLiteral("Hello, 'world'.", '\''));
@@ -122,6 +138,7 @@
         + "subject -> 'Hello, \\'world\\'.', }", env.toString());
   }
 
+  @Test
   public void testBindToNullThrowsException() throws Exception {
     try {
       new Environment().update("some_name", null);
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 f7ed359..f33b500 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
@@ -14,6 +14,10 @@
 package com.google.devtools.build.lib.syntax;
 
 import static com.google.common.truth.Truth.assertThat;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
@@ -22,6 +26,11 @@
 import com.google.devtools.build.lib.packages.PackageFactory;
 import com.google.devtools.build.lib.testutil.TestRuleClassProvider;
 
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -31,13 +40,14 @@
 /**
  * Test of evaluation behavior.  (Implicitly uses lexer + parser.)
  */
+@RunWith(JUnit4.class)
 public class EvaluationTest extends AbstractEvaluationTestCase {
 
   protected Environment env;
 
-  @Override
+  @Before
   public void setUp() throws Exception {
-    super.setUp();
+
     PackageFactory factory = new PackageFactory(TestRuleClassProvider.getRuleClassProvider());
     env = factory.getEnvironment();
   }
@@ -53,6 +63,7 @@
     return eval(parseExpr(input), env);
   }
 
+  @Test
   public void testExprs() throws Exception {
     assertEquals("fooxbar",
                  eval("'%sx' % 'foo' + 'bar'"));
@@ -70,6 +81,7 @@
     checkEvalError("3 % 'foo'", "unsupported operand type(s) for %: 'int' and 'string'");
   }
 
+  @Test
   public void testListExprs() throws Exception {
     assertEquals(Arrays.asList(1, 2, 3),
         eval("[1, 2, 3]"));
@@ -77,10 +89,12 @@
         eval("(1, 2, 3)"));
   }
 
+  @Test
   public void testStringFormatMultipleArgs() throws Exception {
     assertEquals("XYZ", eval("'%sY%s' % ('X', 'Z')"));
   }
 
+  @Test
   public void testAndOr() throws Exception {
     assertEquals(8, eval("8 or 9"));
     assertEquals(8, eval("8 or foo")); // check that 'foo' is not evaluated
@@ -104,11 +118,13 @@
     assertEquals(Environment.NONE, eval("None and 1"));
   }
 
+  @Test
   public void testNot() throws Exception {
     assertEquals(false, eval("not 1"));
     assertEquals(true, eval("not ''"));
   }
 
+  @Test
   public void testNotWithLogicOperators() throws Exception {
     assertEquals(0, eval("0 and not 0"));
     assertEquals(0, eval("not 0 and 0"));
@@ -123,16 +139,19 @@
     assertEquals(false, eval("not (1 or 0)"));
   }
 
+  @Test
   public void testNotWithArithmeticOperators() throws Exception {
     assertEquals(true, eval("not 0 + 0"));
     assertEquals(false, eval("not 2 - 1"));
   }
 
+  @Test
   public void testNotWithCollections() throws Exception {
     assertEquals(true, eval("not []"));
     assertEquals(false, eval("not {'a' : 1}"));
   }
 
+  @Test
   public void testEquality() throws Exception {
     assertEquals(true, eval("1 == 1"));
     assertEquals(false, eval("1 == 2"));
@@ -143,6 +162,7 @@
     assertEquals(true, eval("None == None"));
   }
 
+  @Test
   public void testInequality() throws Exception {
     assertEquals(false, eval("1 != 1"));
     assertEquals(true, eval("1 != 2"));
@@ -152,6 +172,7 @@
     assertEquals(true, eval("[1, 2] != [2, 1]"));
   }
 
+  @Test
   public void testEqualityPrecedence() throws Exception {
     assertEquals(true, eval("1 + 3 == 2 + 2"));
     assertEquals(true, eval("not 1 == 2"));
@@ -160,6 +181,7 @@
     assertEquals(2, eval("2 or 3 == 3 and 1"));
   }
 
+  @Test
   public void testLessThan() throws Exception {
     assertEquals(true, eval("1 <= 1"));
     assertEquals(false, eval("1 < 1"));
@@ -167,6 +189,7 @@
     assertEquals(false, eval("'c' < 'a'"));
   }
 
+  @Test
   public void testGreaterThan() throws Exception {
     assertEquals(true, eval("1 >= 1"));
     assertEquals(false, eval("1 > 1"));
@@ -174,14 +197,17 @@
     assertEquals(true, eval("'c' > 'a'"));
   }
 
+  @Test
   public void testCompareStringInt() throws Exception {
     checkEvalError("'a' >= 1", "Cannot compare string with int");
   }
 
+  @Test
   public void testNotComparable() throws Exception {
     checkEvalError("[1, 2] < [1, 3]", "[1, 2] is not comparable");
   }
 
+  @Test
   public void testSumFunction() throws Exception {
     Function sum = new AbstractFunction("sum") {
         @Override
@@ -216,6 +242,7 @@
     assertEquals(123456, eval("sum", env));
   }
 
+  @Test
   public void testKeywordArgs() throws Exception {
 
     // This function returns the list of keyword-argument keys or values,
@@ -248,6 +275,7 @@
                  eval("keyval(1, foo=1, bar='bar', wiz=[1,2,3])", env));
   }
 
+  @Test
   public void testMult() throws Exception {
     assertEquals(42, eval("6 * 7"));
 
@@ -256,10 +284,12 @@
     assertEquals("100000", eval("'1' + '0' * 5"));
   }
 
+  @Test
   public void testConcatStrings() throws Exception {
     assertEquals("foobar", eval("'foo' + 'bar'"));
   }
 
+  @Test
   public void testConcatLists() throws Exception {
     // list
     Object x = eval("[1,2] + [3,4]");
@@ -276,6 +306,7 @@
   }
 
   @SuppressWarnings("unchecked")
+  @Test
   public void testListComprehensions() throws Exception {
     Iterable<Object> eval = (Iterable<Object>) eval(
         "['foo/%s.java' % x for x in []]");
@@ -311,6 +342,7 @@
 
   // TODO(bazel-team): should this test work in Skylark?
   @SuppressWarnings("unchecked")
+  @Test
   public void testListComprehensionModifiesGlobalEnv() throws Exception {
     Environment env = singletonEnv("x", 42);
     assertThat((Iterable<Object>) eval(parseExpr("[x + 1 for x in [1,2,3]]"), env))
@@ -318,6 +350,7 @@
     assertEquals(3, env.lookup("x")); // (x is global)
   }
 
+  @Test
   public void testDictComprehensions() throws Exception {
     assertEquals(Collections.emptyMap(), eval("{x : x for x in []}"));
     assertEquals(ImmutableMap.of(1, 1, 2, 2), eval("{x : x for x in [1, 2]}"));
@@ -329,18 +362,21 @@
         eval("{'k_' + x : 'v_' + x for x in ['a', 'b']}"));
   }
 
+  @Test
   public void testDictComprehensions_MultipleKey() throws Exception {
     assertEquals(ImmutableMap.of(1, 1, 2, 2), eval("{x : x for x in [1, 2, 1]}"));
     assertEquals(ImmutableMap.of("ab", "ab", "c", "c"),
         eval("{x : x for x in ['ab', 'c', 'a' + 'b']}"));
   }
 
+  @Test
   public void testDictComprehensions_ToString() throws Exception {
     assertEquals("{x: x for x in [1, 2]}", parseExpr("{x : x for x in [1, 2]}").toString());
     assertEquals("{x + 'a': x for x in [1, 2]}",
         parseExpr("{x + 'a' : x for x in [1, 2]}").toString());
   }
 
+  @Test
   public void testListConcatenation() throws Exception {
     assertEquals(Arrays.asList(1, 2, 3, 4), eval("[1, 2] + [3, 4]", env));
     assertEquals(ImmutableList.of(1, 2, 3, 4), eval("(1, 2) + (3, 4)", env));
@@ -348,21 +384,25 @@
     checkEvalError("(1, 2) + [3, 4]", "can only concatenate list (not \"tuple\") to list");
   }
 
+  @Test
   public void testListComprehensionFailsOnNonSequence() throws Exception {
     checkEvalError("[x + 1 for x in 123]", "type 'int' is not an iterable");
   }
 
   @SuppressWarnings("unchecked")
+  @Test
   public void testListComprehensionOnString() throws Exception {
     assertThat((Iterable<Object>) eval("[x for x in 'abc']")).containsExactly("a", "b", "c")
         .inOrder();
   }
 
+  @Test
   public void testInvalidAssignment() throws Exception {
     Environment env = singletonEnv("x", 1);
     checkEvalError(parseStmt("x + 1 = 2"), env, "can only assign to variables, not to 'x + 1'");
   }
 
+  @Test
   public void testListComprehensionOnDictionary() throws Exception {
     List<Statement> input = parseFile("val = ['var_' + n for n in {'a':1,'b':2}]");
     exec(input, env);
@@ -372,58 +412,71 @@
     assertEquals("var_b", Iterables.get(result, 1));
   }
 
+  @Test
   public void testListComprehensionOnDictionaryCompositeExpression() throws Exception {
     exec(parseFile("d = {1:'a',2:'b'}\n"
                   + "l = [d[x] for x in d]"), env);
     assertEquals("[a, b]", env.lookup("l").toString());
   }
 
+  @Test
   public void testInOnListContains() throws Exception {
     assertEquals(Boolean.TRUE, eval("'b' in ['a', 'b']"));
   }
 
+  @Test
   public void testInOnListDoesNotContain() throws Exception {
     assertEquals(Boolean.FALSE, eval("'c' in ['a', 'b']"));
   }
 
+  @Test
   public void testInOnTupleContains() throws Exception {
     assertEquals(Boolean.TRUE, eval("'b' in ('a', 'b')"));
   }
 
+  @Test
   public void testInOnTupleDoesNotContain() throws Exception {
     assertEquals(Boolean.FALSE, eval("'c' in ('a', 'b')"));
   }
 
+  @Test
   public void testInOnDictContains() throws Exception {
     assertEquals(Boolean.TRUE, eval("'b' in {'a' : 1, 'b' : 2}"));
   }
 
+  @Test
   public void testInOnDictDoesNotContainKey() throws Exception {
     assertEquals(Boolean.FALSE, eval("'c' in {'a' : 1, 'b' : 2}"));
   }
 
+  @Test
   public void testInOnDictDoesNotContainVal() throws Exception {
     assertEquals(Boolean.FALSE, eval("1 in {'a' : 1, 'b' : 2}"));
   }
 
+  @Test
   public void testInOnStringContains() throws Exception {
     assertEquals(Boolean.TRUE, eval("'b' in 'abc'"));
   }
 
+  @Test
   public void testInOnStringDoesNotContain() throws Exception {
     assertEquals(Boolean.FALSE, eval("'d' in 'abc'"));
   }
 
+  @Test
   public void testInOnStringLeftNotString() throws Exception {
     checkEvalError("1 in '123'",
         "in operator only works on strings if the left operand is also a string");
   }
 
+  @Test
   public void testInFailsOnNonIterable() throws Exception {
     checkEvalError("'a' in 1",
         "in operator only works on lists, tuples, dictionaries and strings");
   }
 
+  @Test
   public void testInCompositeForPrecedence() throws Exception {
     assertEquals(0, eval("not 'a' in ['a'] or 0"));
   }
@@ -437,27 +490,32 @@
     };
   }
 
+  @Test
   public void testPercOnObject() throws Exception {
     env.update("obj", createObjWithStr());
     assertEquals("str marker", eval("'%s' % obj", env));
   }
 
+  @Test
   public void testPercOnObjectList() throws Exception {
     env.update("obj", createObjWithStr());
     assertEquals("str marker str marker", eval("'%s %s' % (obj, obj)", env));
   }
 
+  @Test
   public void testPercOnObjectInvalidFormat() throws Exception {
     env.update("obj", createObjWithStr());
     checkEvalError("'%d' % obj", env, "invalid arguments for format string");
   }
 
   @SuppressWarnings("unchecked")
+  @Test
   public void testDictKeys() throws Exception {
     exec("v = {'a': 1}.keys() + ['b', 'c']", env);
     assertThat((Iterable<Object>) env.lookup("v")).containsExactly("a", "b", "c").inOrder();
   }
 
+  @Test
   public void testDictKeysTooManyArgs() throws Exception {
     checkEvalError("{'a': 1}.keys('abc')", env, "Invalid number of arguments (expected 0)");
     checkEvalError("{'a': 1}.keys(arg='abc')", env, "Invalid number of arguments (expected 0)");
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 fc14922..eaefb69 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
@@ -14,12 +14,20 @@
 package com.google.devtools.build.lib.syntax;
 
 import static com.google.common.truth.Truth.assertThat;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.fail;
 
 import com.google.common.base.Joiner;
 import com.google.common.collect.ImmutableMap;
 import com.google.devtools.build.lib.packages.MethodLibrary;
 import com.google.devtools.build.lib.syntax.SkylarkType.SkylarkFunctionType;
 
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -27,6 +35,7 @@
 /**
  * A test class for functions and scoping.
  */
+@RunWith(JUnit4.class)
 public class FunctionTest extends AbstractEvaluationTestCase {
 
   private Environment env;
@@ -35,12 +44,13 @@
       ImmutableMap.<String, SkylarkType>of(
           "outer_func", SkylarkFunctionType.of("outer_func", SkylarkType.NONE));
 
-  @Override
+  @Before
   public void setUp() throws Exception {
-    super.setUp();
+
     env = new SkylarkEnvironment(syntaxEvents.collector());
   }
 
+  @Test
   public void testFunctionDef() throws Exception {
     List<Statement> input = parseFileForSkylark(
         "def func(a,b,c):\n"
@@ -55,6 +65,7 @@
     assertThat(stmt.getStatements()).hasSize(2);
   }
 
+  @Test
   public void testFunctionDefDuplicateArguments() throws Exception {
     syntaxEvents.setFailFast(false);
     parseFileForSkylark(
@@ -63,6 +74,7 @@
     syntaxEvents.assertContainsEvent("duplicate parameter name in function definition");
   }
 
+  @Test
   public void testFunctionDefCallOuterFunc() throws Exception {
     final List<Object> params = new ArrayList<>();
     List<Statement> input = parseFileForSkylark(
@@ -89,6 +101,7 @@
     env.update("outer_func", outerFunc);
   }
 
+  @Test
   public void testFunctionDefNoEffectOutsideScope() throws Exception {
     List<Statement> input = parseFileForSkylark(
         "def func():\n"
@@ -99,6 +112,7 @@
     assertEquals(1, env.lookup("a"));
   }
 
+  @Test
   public void testFunctionDefGlobalVaribleReadInFunction() throws Exception {
     List<Statement> input = parseFileForSkylark(
         "a = 1\n"
@@ -110,6 +124,7 @@
     assertEquals(1, env.lookup("c"));
   }
 
+  @Test
   public void testFunctionDefLocalGlobalScope() throws Exception {
     List<Statement> input = parseFileForSkylark(
         "a = 1\n"
@@ -122,6 +137,7 @@
     assertEquals(2, env.lookup("c"));
   }
 
+  @Test
   public void testFunctionDefLocalVariableReferencedBeforeAssignment() throws Exception {
     List<Statement> input = parseFileForSkylark(
         "a = 1\n"
@@ -138,6 +154,7 @@
     }
   }
 
+  @Test
   public void testFunctionDefLocalVariableReferencedAfterAssignment() throws Exception {
     List<Statement> input = parseFileForSkylark(
         "a = 1\n"
@@ -152,6 +169,7 @@
   }
 
   @SuppressWarnings("unchecked")
+  @Test
   public void testSkylarkGlobalComprehensionIsAllowed() throws Exception {
     List<Statement> input = parseFileForSkylark(
         "a = [i for i in [1, 2, 3]]\n");
@@ -159,6 +177,7 @@
     assertThat((Iterable<Object>) env.lookup("a")).containsExactly(1, 2, 3).inOrder();
   }
 
+  @Test
   public void testFunctionReturn() throws Exception {
     List<Statement> input = parseFileForSkylark(
         "def func():\n"
@@ -168,6 +187,7 @@
     assertEquals(2, env.lookup("b"));
   }
 
+  @Test
   public void testFunctionReturnFromALoop() throws Exception {
     List<Statement> input = parseFileForSkylark(
         "def func():\n"
@@ -178,6 +198,7 @@
     assertEquals(1, env.lookup("b"));
   }
 
+  @Test
   public void testFunctionExecutesProperly() throws Exception {
     List<Statement> input = parseFileForSkylark(
         "def func(a):\n"
@@ -192,6 +213,7 @@
     assertEquals(2, env.lookup("d"));
   }
 
+  @Test
   public void testFunctionCallFromFunction() throws Exception {
     final List<Object> params = new ArrayList<>();
     List<Statement> input = parseFileForSkylark(
@@ -207,6 +229,7 @@
     assertThat(params).containsExactly(1, 2).inOrder();
   }
 
+  @Test
   public void testFunctionCallFromFunctionReadGlobalVar() throws Exception {
     List<Statement> input = parseFileForSkylark(
         "a = 1\n"
@@ -219,6 +242,7 @@
     assertEquals(1, env.lookup("b"));
   }
 
+  @Test
   public void testSingleLineFunction() throws Exception {
     List<Statement> input = parseFileForSkylark(
         "def func(): return 'a'\n"
@@ -227,6 +251,7 @@
     assertEquals("a", env.lookup("s"));
   }
 
+  @Test
   public void testFunctionReturnsDictionary() throws Exception {
     MethodLibrary.setupMethodEnvironment(env);
     List<Statement> input = parseFileForSkylark(
@@ -237,6 +262,7 @@
     assertEquals(1, env.lookup("a"));
   }
 
+  @Test
   public void testFunctionReturnsList() throws Exception {
     MethodLibrary.setupMethodEnvironment(env);
     List<Statement> input = parseFileForSkylark(
@@ -248,6 +274,7 @@
   }
 
   @SuppressWarnings("unchecked")
+  @Test
   public void testFunctionListArgumentsAreImmutable() throws Exception {
     MethodLibrary.setupMethodEnvironment(env);
     List<Statement> input = parseFileForSkylark(
@@ -259,6 +286,7 @@
     assertThat((Iterable<Object>) env.lookup("l")).containsExactly(1);
   }
 
+  @Test
   public void testFunctionDictArgumentsAreImmutable() throws Exception {
     MethodLibrary.setupMethodEnvironment(env);
     List<Statement> input = parseFileForSkylark(
@@ -270,6 +298,7 @@
     assertEquals(ImmutableMap.of("a", 1), env.lookup("d"));
   }
 
+  @Test
   public void testFunctionNameAliasing() throws Exception {
     List<Statement> input = parseFileForSkylark(
           "def func(a):\n"
@@ -280,6 +309,7 @@
     assertEquals(2, env.lookup("r"));
   }
 
+  @Test
   public void testCallingFunctionsWithMixedModeArgs() throws Exception {
     List<Statement> input = parseFileForSkylark(
           "def func(a, b, c):\n"
@@ -299,6 +329,7 @@
          + "  return r\n";
   }
 
+  @Test
   public void testWhichOptionalArgsAreDefinedForFunctions() throws Exception {
     List<Statement> input = parseFileForSkylark(
         functionWithOptionalArgs()
@@ -313,6 +344,7 @@
     assertEquals("4ac", env.lookup("v4"));
   }
 
+  @Test
   public void testDefaultArguments() throws Exception {
     List<Statement> input = parseFileForSkylark(
           "def func(a, b = 'b', c = 'c'):\n"
@@ -328,6 +360,7 @@
     assertEquals("aby", env.lookup("v4"));
   }
 
+  @Test
   public void testDefaultArgumentsInsufficientArgNum() throws Exception {
     checkError("func(a, b = null, c = null) received insufficient arguments",
         "def func(a, b = 'b', c = 'c'):",
@@ -335,6 +368,7 @@
         "func()");
   }
 
+  @Test
   public void testKwargs() throws Exception {
     List<Statement> input = parseFileForSkylark(
         "def foo(a, b = 'b', c = 'c'):\n"
@@ -349,6 +383,7 @@
     assertEquals("xyz", env.lookup("v3"));
   }
 
+  @Test
   public void testKwargsBadKey() throws Exception {
     checkError("Keywords must be strings, not int",
         "def func(a, b):",
@@ -356,6 +391,7 @@
         "func('a', **{3: 1})");
   }
 
+  @Test
   public void testKwargsIsNotDict() throws Exception {
     checkError("Argument after ** must be a dictionary, not int",
         "def func(a, b):",
@@ -363,6 +399,7 @@
         "func('a', **42)");
   }
 
+  @Test
   public void testKwargsCollision() throws Exception {
     checkError("func(a, b) got multiple values for keyword argument 'b'",
         "def func(a, b):",
@@ -370,6 +407,7 @@
         "func('a', 'b', **{'b': 'foo'})");
   }
 
+  @Test
   public void testKwargsCollisionWithNamed() throws Exception {
     checkError("duplicate keyword 'b' in call to func",
         "def func(a, b):",
@@ -377,6 +415,7 @@
         "func('a', b = 'b', **{'b': 'foo'})");
   }
 
+  @Test
   public void testDefaultArguments2() throws Exception {
     List<Statement> input = parseFileForSkylark(
         "a = 2\n"
@@ -389,6 +428,7 @@
     assertEquals(2, env.lookup("v"));
   }
 
+  @Test
   public void testMixingPositionalOptional() throws Exception {
     List<Statement> input = parseFileForSkylark(
                 "def f(name, value = '', optional = ''): return value\n"
@@ -397,6 +437,7 @@
     assertEquals("value", env.lookup("v"));
   }
 
+  @Test
   public void testStarArg() throws Exception {
     List<Statement> input = parseFileForSkylark(
                 "def f(name, value = '1', optional = '2'): return name + value + optional\n"
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/MixedModeFunctionTest.java b/src/test/java/com/google/devtools/build/lib/syntax/MixedModeFunctionTest.java
index c7c2c40..cb879f8 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/MixedModeFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/MixedModeFunctionTest.java
@@ -13,13 +13,21 @@
 // limitations under the License.
 package com.google.devtools.build.lib.syntax;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
 import com.google.common.collect.ImmutableList;
 
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
 import java.util.Arrays;
 
 /**
  * Tests for {@link MixedModeFunction}.
  */
+@RunWith(JUnit4.class)
 public class MixedModeFunctionTest extends AbstractEvaluationTestCase {
 
   private Environment singletonEnv(String id, Object value) {
@@ -91,6 +99,7 @@
     }
   }
 
+  @Test
   public void testNoSurplusArguments() throws Exception {
     checkMixedModeFunctions(false,
                             "mixed(foo, bar = null)",
@@ -110,6 +119,7 @@
       });
   }
 
+  @Test
   public void testOnlyNamedArguments() throws Exception {
     checkMixedModeFunctions(true,
                             "mixed(foo, bar = null)",
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java b/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java
index e698728..a4fa5d1 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java
@@ -15,16 +15,24 @@
 
 import static com.google.common.truth.Truth.assertThat;
 import static com.google.common.truth.Truth.assertWithMessage;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
 import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.syntax.DictionaryLiteral.DictionaryEntryLiteral;
 
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
 import java.util.List;
 
 /**
  *  Tests of parser behaviour.
- *
  */
+@RunWith(JUnit4.class)
 public class ParserTest extends AbstractParserTestCase {
 
   private static String getText(String text, ASTNode node) {
@@ -57,6 +65,7 @@
     return f.getArguments().get(index).getValue();
   }
 
+  @Test
   public void testPrecedence1() throws Exception {
     BinaryOperatorExpression e =
       (BinaryOperatorExpression) parseExpr("'%sx' % 'foo' + 'bar'");
@@ -64,24 +73,28 @@
     assertEquals(Operator.PLUS, e.getOperator());
   }
 
+  @Test
   public void testPrecedence2() throws Exception {
     BinaryOperatorExpression e =
       (BinaryOperatorExpression) parseExpr("('%sx' % 'foo') + 'bar'");
     assertEquals(Operator.PLUS, e.getOperator());
   }
 
+  @Test
   public void testPrecedence3() throws Exception {
     BinaryOperatorExpression e =
       (BinaryOperatorExpression) parseExpr("'%sx' % ('foo' + 'bar')");
     assertEquals(Operator.PERCENT, e.getOperator());
   }
 
+  @Test
   public void testPrecedence4() throws Exception {
     BinaryOperatorExpression e =
         (BinaryOperatorExpression) parseExpr("1 + - (2 - 3)");
     assertEquals(Operator.PLUS, e.getOperator());
   }
 
+  @Test
   public void testUnaryMinusExpr() throws Exception {
     FuncallExpression e = (FuncallExpression) parseExpr("-5");
     FuncallExpression e2 = (FuncallExpression) parseExpr("- 5");
@@ -96,6 +109,7 @@
     assertEquals(5, (int) arg0.getValue());
   }
 
+  @Test
   public void testFuncallExpr() throws Exception {
     FuncallExpression e = (FuncallExpression) parseExpr("foo(1, 2, bar=wiz)");
 
@@ -117,6 +131,7 @@
     assertEquals("wiz", arg2val.getName());
   }
 
+  @Test
   public void testMethCallExpr() throws Exception {
     FuncallExpression e =
       (FuncallExpression) parseExpr("foo.foo(1, 2, bar=wiz)");
@@ -139,6 +154,7 @@
     assertEquals("wiz", arg2val.getName());
   }
 
+  @Test
   public void testChainedMethCallExpr() throws Exception {
     FuncallExpression e =
       (FuncallExpression) parseExpr("foo.replace().split(1)");
@@ -153,6 +169,7 @@
     assertEquals(1, (int) arg0.getValue());
   }
 
+  @Test
   public void testPropRefExpr() throws Exception {
     DotExpression e = (DotExpression) parseExpr("foo.foo");
 
@@ -160,6 +177,7 @@
     assertEquals("foo", ident.getName());
   }
 
+  @Test
   public void testStringMethExpr() throws Exception {
     FuncallExpression e = (FuncallExpression) parseExpr("'foo'.foo()");
 
@@ -169,26 +187,31 @@
     assertThat(e.getArguments()).isEmpty();
   }
 
+  @Test
   public void testStringLiteralOptimizationValue() throws Exception {
     StringLiteral l = (StringLiteral) parseExpr("'abc' + 'def'");
     assertEquals("abcdef", l.value);
   }
 
+  @Test
   public void testStringLiteralOptimizationToString() throws Exception {
     StringLiteral l = (StringLiteral) parseExpr("'abc' + 'def'");
     assertEquals("'abcdef'", l.toString());
   }
 
+  @Test
   public void testStringLiteralOptimizationLocation() throws Exception {
     StringLiteral l = (StringLiteral) parseExpr("'abc' + 'def'");
     assertEquals(0, l.getLocation().getStartOffset());
     assertEquals(13, l.getLocation().getEndOffset());
   }
 
+  @Test
   public void testStringLiteralOptimizationDifferentQuote() throws Exception {
     assertThat(parseExpr("'abc' + \"def\"")).isInstanceOf(BinaryOperatorExpression.class);
   }
 
+  @Test
   public void testSubstring() throws Exception {
     FuncallExpression e = (FuncallExpression) parseExpr("'FOO.CC'[:].lower()[1:]");
     assertEquals("$substring", e.getFunction().getName());
@@ -214,6 +237,7 @@
     }
   }
 
+  @Test
   public void testErrorRecovery() throws Exception {
     syntaxEvents.setFailFast(false);
 
@@ -245,6 +269,7 @@
     assertEquals(3, (int) arg2.getValue());
   }
 
+  @Test
   public void testDoesntGetStuck() throws Exception {
     syntaxEvents.setFailFast(false);
 
@@ -262,6 +287,7 @@
                                           // i.e. there were some events
   }
 
+  @Test
   public void testSecondaryLocation() {
     String expr = "f(1 % 2)";
     FuncallExpression call = (FuncallExpression) parseExpr(expr);
@@ -269,6 +295,7 @@
     assertTrue(arg.getLocation().getEndOffset() < call.getLocation().getEndOffset());
   }
 
+  @Test
   public void testPrimaryLocation() {
     String expr = "f(1 + 2)";
     FuncallExpression call = (FuncallExpression) parseExpr(expr);
@@ -276,6 +303,7 @@
     assertTrue(arg.getLocation().getEndOffset() < call.getLocation().getEndOffset());
   }
 
+  @Test
   public void testAssignLocation() {
     String expr = "a = b;c = d\n";
     List<Statement> statements = parseFile(expr);
@@ -283,12 +311,14 @@
     assertEquals(5, statement.getLocation().getEndOffset());
   }
 
+  @Test
   public void testAssign() {
     String expr = "list[0] = 5; dict['key'] = value\n";
     List<Statement> statements = parseFile(expr);
     assertThat(statements).hasSize(2);
   }
 
+  @Test
   public void testInvalidAssign() {
     syntaxEvents.setFailFast(false);
     parseExpr("1 + (b = c)");
@@ -296,10 +326,12 @@
     syntaxEvents.collector().clear();
   }
 
+  @Test
   public void testAugmentedAssign() throws Exception {
     assertEquals("[x = x + 1\n]", parseFile("x += 1").toString());
   }
 
+  @Test
   public void testPrettyPrintFunctions() throws Exception {
     assertEquals("[x[1:3]\n]", parseFile("x[1:3]").toString());
     assertEquals("[str[42]\n]", parseFile("str[42]").toString());
@@ -307,6 +339,7 @@
     assertEquals("[new_file(['hello'])\n]", parseFile("new_file('hello')").toString());
   }
 
+  @Test
   public void testFuncallLocation() {
     String expr = "a(b);c = d\n";
     List<Statement> statements = parseFile(expr);
@@ -314,6 +347,7 @@
     assertEquals(4, statement.getLocation().getEndOffset());
   }
 
+  @Test
   public void testSpecialFuncallLocation() throws Exception {
     List<Statement> statements = parseFile("-x\n");
     assertLocation(0, 3, statements.get(0).getLocation());
@@ -325,6 +359,7 @@
     assertLocation(0, 10, statements.get(0).getLocation());
   }
 
+  @Test
   public void testListPositions() throws Exception {
     String expr = "[0,f(1),2]";
     ListLiteral list = (ListLiteral) parseExpr(expr);
@@ -334,6 +369,7 @@
     assertEquals("2",    getText(expr, getElem(list, 2)));
   }
 
+  @Test
   public void testDictPositions() throws Exception {
     String expr = "{1:2,2:f(1),3:4}";
     DictionaryLiteral list = (DictionaryLiteral) parseExpr(expr);
@@ -343,6 +379,7 @@
     assertEquals("3:4",    getText(expr, getElem(list, 2)));
   }
 
+  @Test
   public void testArgumentPositions() throws Exception {
     String stmt = "f(0,g(1,2),2)";
     FuncallExpression f = (FuncallExpression) parseExpr(stmt);
@@ -352,6 +389,7 @@
     assertEquals("2",    getText(stmt, getArg(f, 2)));
   }
 
+  @Test
   public void testListLiterals1() throws Exception {
     ListLiteral list = (ListLiteral) parseExpr("[0,1,2]");
     assertFalse(list.isTuple());
@@ -362,6 +400,7 @@
     }
   }
 
+  @Test
   public void testTupleLiterals2() throws Exception {
     ListLiteral tuple = (ListLiteral) parseExpr("(0,1,2)");
     assertTrue(tuple.isTuple());
@@ -372,12 +411,14 @@
     }
   }
 
+  @Test
   public void testTupleLiterals3() throws Exception {
     ListLiteral emptyTuple = (ListLiteral) parseExpr("()");
     assertTrue(emptyTuple.isTuple());
     assertThat(emptyTuple.getElements()).isEmpty();
   }
 
+  @Test
   public void testTupleLiterals4() throws Exception {
     ListLiteral singletonTuple = (ListLiteral) parseExpr("(42,)");
     assertTrue(singletonTuple.isTuple());
@@ -385,17 +426,20 @@
     assertEquals(42, getIntElem(singletonTuple, 0));
   }
 
+  @Test
   public void testTupleLiterals5() throws Exception {
     IntegerLiteral intLit = (IntegerLiteral) parseExpr("(42)"); // not a tuple!
     assertEquals(42, (int) intLit.getValue());
   }
 
+  @Test
   public void testListLiterals6() throws Exception {
     ListLiteral emptyList = (ListLiteral) parseExpr("[]");
     assertFalse(emptyList.isTuple());
     assertThat(emptyList.getElements()).isEmpty();
   }
 
+  @Test
   public void testListLiterals7() throws Exception {
     ListLiteral singletonList = (ListLiteral) parseExpr("[42,]");
     assertFalse(singletonList.isTuple());
@@ -403,6 +447,7 @@
     assertEquals(42, getIntElem(singletonList, 0));
   }
 
+  @Test
   public void testListLiterals8() throws Exception {
     ListLiteral singletonList = (ListLiteral) parseExpr("[42]"); // a singleton
     assertFalse(singletonList.isTuple());
@@ -410,6 +455,7 @@
     assertEquals(42, getIntElem(singletonList, 0));
   }
 
+  @Test
   public void testDictionaryLiterals() throws Exception {
     DictionaryLiteral dictionaryList =
       (DictionaryLiteral) parseExpr("{1:42}"); // a singleton dictionary
@@ -419,12 +465,14 @@
     assertEquals(42, getIntElem(tuple, false));
   }
 
+  @Test
   public void testDictionaryLiterals1() throws Exception {
     DictionaryLiteral dictionaryList =
       (DictionaryLiteral) parseExpr("{}"); // an empty dictionary
     assertThat(dictionaryList.getEntries()).isEmpty();
   }
 
+  @Test
   public void testDictionaryLiterals2() throws Exception {
     DictionaryLiteral dictionaryList =
       (DictionaryLiteral) parseExpr("{1:42,}"); // a singleton dictionary
@@ -434,6 +482,7 @@
     assertEquals(42, getIntElem(tuple, false));
   }
 
+  @Test
   public void testDictionaryLiterals3() throws Exception {
     DictionaryLiteral dictionaryList = (DictionaryLiteral) parseExpr("{1:42,2:43,3:44}");
     assertThat(dictionaryList.getEntries()).hasSize(3);
@@ -444,6 +493,7 @@
     }
   }
 
+  @Test
   public void testListLiterals9() throws Exception {
     ListLiteral singletonList =
       (ListLiteral) parseExpr("[ abi + opt_level + \'/include\' ]");
@@ -451,6 +501,7 @@
     assertThat(singletonList.getElements()).hasSize(1);
   }
 
+  @Test
   public void testListComprehensionSyntax() throws Exception {
     syntaxEvents.setFailFast(false);
 
@@ -475,6 +526,7 @@
     syntaxEvents.collector().clear();
   }
 
+  @Test
   public void testListComprehension() throws Exception {
     ListComprehension list =
       (ListComprehension) parseExpr(
@@ -491,22 +543,26 @@
     assertThat(list.getLists()).hasSize(2);
   }
 
+  @Test
   public void testParserContainsErrorsIfSyntaxException() throws Exception {
     syntaxEvents.setFailFast(false);
     parseExpr("'foo' %%");
     syntaxEvents.assertContainsEvent("syntax error at '%'");
   }
 
+  @Test
   public void testParserDoesNotContainErrorsIfSuccess() throws Exception {
     parseExpr("'foo'");
   }
 
+  @Test
   public void testParserContainsErrors() throws Exception {
     syntaxEvents.setFailFast(false);
     parseStmt("+");
     syntaxEvents.assertContainsEvent("syntax error at '+'");
   }
 
+  @Test
   public void testSemicolonAndNewline() throws Exception {
     List<Statement> stmts = parseFile(
       "foo='bar'; foo(bar)" + '\n'
@@ -516,6 +572,7 @@
     assertThat(stmts).hasSize(4);
   }
 
+  @Test
   public void testSemicolonAndNewline2() throws Exception {
     syntaxEvents.setFailFast(false);
     List<Statement> stmts = parseFile(
@@ -526,6 +583,7 @@
     assertThat(stmts).hasSize(2);
   }
 
+  @Test
   public void testExprAsStatement() throws Exception {
     List<Statement> stmts = parseFile(
       "li = []\n"
@@ -536,6 +594,7 @@
     assertThat(stmts).hasSize(4);
   }
 
+  @Test
   public void testParseBuildFileWithSingeRule() throws Exception {
     List<Statement> stmts = parseFile(
       "genrule(name = 'foo'," + '\n'
@@ -547,6 +606,7 @@
     assertThat(stmts).hasSize(1);
   }
 
+  @Test
   public void testParseBuildFileWithMultipleRules() throws Exception {
     List<Statement> stmts = parseFile(
       "genrule(name = 'foo'," + '\n'
@@ -563,6 +623,7 @@
     assertThat(stmts).hasSize(2);
   }
 
+  @Test
   public void testParseBuildFileWithComments() throws Exception {
     Parser.ParseResult result = parseFileWithComments(
       "# Test BUILD file" + '\n'
@@ -578,6 +639,7 @@
     assertThat(result.comments).hasSize(2);
   }
 
+  @Test
   public void testParseBuildFileWithManyComments() throws Exception {
     Parser.ParseResult result = parseFileWithComments(
       "# 1" + '\n'
@@ -614,6 +676,7 @@
         .that(result.comments.size()).isEqualTo(10); // One per '#'
   }
 
+  @Test
   public void testMissingComma() throws Exception {
     syntaxEvents.setFailFast(false);
     // Regression test.
@@ -623,6 +686,7 @@
     syntaxEvents.assertContainsEvent("syntax error at 'srcs'");
   }
 
+  @Test
   public void testDoubleSemicolon() throws Exception {
     syntaxEvents.setFailFast(false);
     // Regression test.
@@ -630,6 +694,7 @@
     syntaxEvents.assertContainsEvent("syntax error at ';'");
   }
 
+  @Test
   public void testFunctionDefinitionErrorRecovery() throws Exception {
     // Parser skips over entire function definitions, and reports a meaningful
     // error.
@@ -645,6 +710,7 @@
     assertThat(stmts).hasSize(2);
   }
 
+  @Test
   public void testFunctionDefinitionIgnored() throws Exception {
     // Parser skips over entire function definitions without reporting error,
     // when parsePython is set to true.
@@ -666,6 +732,7 @@
     assertThat(stmts).hasSize(2);
   }
 
+  @Test
   public void testMissingBlock() throws Exception {
     syntaxEvents.setFailFast(false);
     List<Statement> stmts = parseFile(
@@ -677,6 +744,7 @@
     syntaxEvents.assertContainsEvent("expected an indented block");
   }
 
+  @Test
   public void testInvalidDef() throws Exception {
     syntaxEvents.setFailFast(false);
     parseFile(
@@ -687,6 +755,7 @@
     syntaxEvents.assertContainsEvent("syntax error at 'EOF'");
   }
 
+  @Test
   public void testSkipIfBlock() throws Exception {
     // Skip over 'if' blocks, when parsePython is set
     List<Statement> stmts = parseFile(
@@ -700,6 +769,7 @@
     assertThat(stmts).hasSize(2);
   }
 
+  @Test
   public void testSkipIfBlockFail() throws Exception {
     // Do not parse 'if' blocks, when parsePython is not set
     syntaxEvents.setFailFast(false);
@@ -713,6 +783,7 @@
     syntaxEvents.assertContainsEvent("This Python-style construct is not supported");
   }
 
+  @Test
   public void testForLoopMultipleVariablesFail() throws Exception {
     // For loops with multiple variables are not allowed, when parsePython is not set
     syntaxEvents.setFailFast(false);
@@ -723,6 +794,7 @@
     syntaxEvents.assertContainsEvent("For loops with multiple variables are not yet supported.");
   }
 
+  @Test
   public void testForLoopMultipleVariables() throws Exception {
     // For loops with multiple variables is ok, when parsePython is set
     List<Statement> stmts1 = parseFile(
@@ -741,6 +813,7 @@
     assertThat(stmts3).hasSize(1);
   }
 
+  @Test
   public void testForLoopBadSyntax() throws Exception {
     syntaxEvents.setFailFast(false);
     parseFile(
@@ -749,6 +822,7 @@
     syntaxEvents.assertContainsEvent("syntax error");
   }
 
+  @Test
   public void testForLoopBadSyntax2() throws Exception {
     syntaxEvents.setFailFast(false);
     parseFile(
@@ -757,18 +831,21 @@
     syntaxEvents.assertContainsEvent("syntax error");
   }
 
+  @Test
   public void testFunCallBadSyntax() throws Exception {
     syntaxEvents.setFailFast(false);
     parseFile("f(1,\n");
     syntaxEvents.assertContainsEvent("syntax error");
   }
 
+  @Test
   public void testFunCallBadSyntax2() throws Exception {
     syntaxEvents.setFailFast(false);
     parseFile("f(1, 5, ,)\n");
     syntaxEvents.assertContainsEvent("syntax error");
   }
 
+  @Test
   public void testLoadOneSymbol() throws Exception {
     List<Statement> statements = parseFileForSkylark(
         "load('/foo/bar/file', 'fun_test')\n");
@@ -777,6 +854,7 @@
     assertThat(stmt.getSymbols()).hasSize(1);
   }
 
+  @Test
   public void testLoadMultipleSymbols() throws Exception {
     List<Statement> statements = parseFileForSkylark(
         "load('file', 'foo', 'bar')\n");
@@ -785,36 +863,42 @@
     assertThat(stmt.getSymbols()).hasSize(2);
   }
 
+  @Test
   public void testLoadSyntaxError() throws Exception {
     syntaxEvents.setFailFast(false);
     parseFileForSkylark("load(non_quoted, 'a')\n");
     syntaxEvents.assertContainsEvent("syntax error");
   }
 
+  @Test
   public void testLoadSyntaxError2() throws Exception {
     syntaxEvents.setFailFast(false);
     parseFileForSkylark("load('non_quoted', a)\n");
     syntaxEvents.assertContainsEvent("syntax error");
   }
 
+  @Test
   public void testLoadNotAtTopLevel() throws Exception {
     syntaxEvents.setFailFast(false);
     parseFileForSkylark("if 1: load(8)\n");
     syntaxEvents.assertContainsEvent("function 'load' does not exist");
   }
 
+  @Test
   public void testParseErrorNotComparison() throws Exception {
     syntaxEvents.setFailFast(false);
     parseFile("2 < not 3");
     syntaxEvents.assertContainsEvent("syntax error at 'not'");
   }
 
+  @Test
   public void testNotWithArithmeticOperatorsBadSyntax() throws Exception {
     syntaxEvents.setFailFast(false);
     parseFile("0 + not 0");
     syntaxEvents.assertContainsEvent("syntax error at 'not'");
   }
 
+  @Test
   public void testOptionalArgBeforeMandatoryArgInFuncDef() throws Exception {
     syntaxEvents.setFailFast(false);
     parseFileForSkylark("def func(a, b = 'a', c):\n  return 0\n");
@@ -822,6 +906,7 @@
         "a mandatory positional parameter must not follow an optional parameter");
   }
 
+  @Test
   public void testKwargBeforePositionalArg() throws Exception {
     syntaxEvents.setFailFast(false);
     parseFileForSkylark(
@@ -830,6 +915,7 @@
     syntaxEvents.assertContainsEvent("unexpected tokens after kwarg");
   }
 
+  @Test
   public void testDuplicateKwarg() throws Exception {
     syntaxEvents.setFailFast(false);
     parseFileForSkylark(
@@ -838,6 +924,7 @@
     syntaxEvents.assertContainsEvent("unexpected tokens after kwarg");
   }
 
+  @Test
   public void testUnnamedStar() throws Exception {
     syntaxEvents.setFailFast(false);
     parseFileForSkylark(
@@ -845,6 +932,7 @@
     syntaxEvents.assertContainsEvent("no star, star-star or named-only parameters (for now)");
   }
 
+  @Test
   public void testTopLevelForFails() throws Exception {
     syntaxEvents.setFailFast(false);
     parseFileForSkylark("for i in []: 0\n");
@@ -852,6 +940,7 @@
         "for loops are not allowed on top-level. Put it into a function");
   }
 
+  @Test
   public void testNestedFunctionFails() throws Exception {
     syntaxEvents.setFailFast(false);
     parseFileForSkylark(
@@ -862,12 +951,14 @@
         "nested functions are not allowed. Move the function to top-level");
   }
 
+  @Test
   public void testIncludeFailureSkylark() throws Exception {
     syntaxEvents.setFailFast(false);
     parseFileForSkylark("include('//foo:bar')");
     syntaxEvents.assertContainsEvent("function 'include' does not exist");
   }
 
+  @Test
   public void testIncludeFailure() throws Exception {
     syntaxEvents.setFailFast(false);
     parseFile("include('nonexistent')\n");
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 ff3c700..3e0b0f3 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
@@ -14,6 +14,10 @@
 package com.google.devtools.build.lib.syntax;
 
 import static com.google.common.truth.Truth.assertThat;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
 
 import com.google.common.collect.ImmutableCollection;
 import com.google.common.collect.ImmutableList;
@@ -31,11 +35,16 @@
 import com.google.devtools.build.lib.rules.SkylarkModules;
 import com.google.devtools.build.lib.syntax.ClassObject.SkylarkClassObject;
 
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
 import java.util.List;
 
 /**
  * Evaluation tests with Skylark Environment.
  */
+@RunWith(JUnit4.class)
 public class SkylarkEvaluationTest extends EvaluationTest {
 
   @SkylarkModule(name = "Mock", doc = "")
@@ -152,6 +161,7 @@
     return env;
   }
 
+  @Test
   public void testSimpleIf() throws Exception {
     exec(parseFileForSkylark(
         "def foo():\n"
@@ -163,6 +173,7 @@
     assertEquals(0, env.lookup("a"));
   }
 
+  @Test
   public void testNestedIf() throws Exception {
     executeNestedIf(0, 0, env);
     assertEquals(0, env.lookup("x"));
@@ -190,6 +201,7 @@
     exec(input, env);
   }
 
+  @Test
   public void testIfElse() throws Exception {
     executeIfElse("something", 2);
     executeIfElse("", 3);
@@ -210,14 +222,17 @@
     assertEquals(expectedA, env.lookup("a"));
   }
 
+  @Test
   public void testIfElifElse_IfExecutes() throws Exception {
     execIfElifElse(1, 0, 1);
   }
 
+  @Test
   public void testIfElifElse_ElifExecutes() throws Exception {
     execIfElifElse(0, 1, 2);
   }
 
+  @Test
   public void testIfElifElse_ElseExecutes() throws Exception {
     execIfElifElse(0, 0, 3);
   }
@@ -238,6 +253,7 @@
     assertEquals(v, env.lookup("v"));
   }
 
+  @Test
   public void testForOnList() throws Exception {
     List<Statement> input = parseFileForSkylark(
         "def foo():\n"
@@ -252,6 +268,7 @@
   }
 
   @SuppressWarnings("unchecked")
+  @Test
   public void testForOnString() throws Exception {
     List<Statement> input = parseFileForSkylark(
         "def foo():\n"
@@ -265,6 +282,7 @@
     assertThat((Iterable<Object>) env.lookup("s")).containsExactly("a", "b", "c").inOrder();
   }
 
+  @Test
   public void testForAssignmentList() throws Exception {
     List<Statement> input = parseFileForSkylark(
         "def foo():\n"
@@ -280,6 +298,7 @@
     assertEquals("abc", env.lookup("s"));
   }
 
+  @Test
   public void testForAssignmentDict() throws Exception {
     List<Statement> input = parseFileForSkylark(
           "def func():\n"
@@ -295,6 +314,7 @@
     assertEquals("abc", env.lookup("s"));
   }
 
+  @Test
   public void testForNotIterable() throws Exception {
     env.update("mock", new Mock());
     List<Statement> input = parseFileForSkylark(
@@ -304,6 +324,7 @@
     checkEvalError(input, env, "type 'int' is not an iterable");
   }
 
+  @Test
   public void testForOnDictionary() throws Exception {
     List<Statement> input = parseFileForSkylark(
         "def foo():\n"
@@ -317,6 +338,7 @@
     assertEquals("abc", env.lookup("s"));
   }
 
+  @Test
   public void testForLoopReuseVariable() throws Exception {
     List<Statement> input = parseFileForSkylark(
         "def foo():\n"
@@ -330,6 +352,7 @@
     assertEquals("cdcd", env.lookup("s"));
   }
 
+  @Test
   public void testNoneAssignment() throws Exception {
     List<Statement> input = parseFileForSkylark(
         "def foo(x=None):\n"
@@ -342,6 +365,7 @@
     assertEquals(2, env.lookup("s"));
   }
 
+  @Test
   public void testJavaCalls() throws Exception {
     env.update("mock", new Mock());
     List<Statement> input = parseFileForSkylark(
@@ -350,6 +374,7 @@
     assertEquals(Boolean.FALSE, env.lookup("b"));
   }
 
+  @Test
   public void testJavaCallsOnSubClass() throws Exception {
     env.update("mock", new MockSubClass());
     List<Statement> input = parseFileForSkylark(
@@ -358,6 +383,7 @@
     assertEquals(Boolean.FALSE, env.lookup("b"));
   }
 
+  @Test
   public void testJavaCallsOnInterface() throws Exception {
     env.update("mock", new MockSubClass());
     List<Statement> input = parseFileForSkylark(
@@ -366,18 +392,21 @@
     assertEquals(Boolean.FALSE, env.lookup("b"));
   }
 
+  @Test
   public void testJavaCallsNotSkylarkCallable() throws Exception {
     env.update("mock", new Mock());
     List<Statement> input = parseFileForSkylark("mock.value()", MOCK_TYPES);
     checkEvalError(input, env, "No matching method found for value() in Mock");
   }
 
+  @Test
   public void testJavaCallsNoMethod() throws Exception {
     List<Statement> input = parseFileForSkylark(
         "s = 3.bad()");
     checkEvalError(input, env, "No matching method found for bad() in int");
   }
 
+  @Test
   public void testJavaCallsNoMethodErrorMsg() throws Exception {
     List<Statement> input = parseFileForSkylark(
         "s = 3.bad('a', 'b', 'c')");
@@ -385,6 +414,7 @@
         "No matching method found for bad(string, string, string) in int");
   }
 
+  @Test
   public void testJavaCallsMultipleMethod() throws Exception {
     env.update("mock", new MockMultipleMethodClass());
     List<Statement> input = parseFileForSkylark(
@@ -393,17 +423,20 @@
         "Multiple matching methods for method(string) in MockMultipleMethodClass");
   }
 
+  @Test
   public void testJavaCallWithKwargs() throws Exception {
     List<Statement> input = parseFileForSkylark("comp = 3.compare_to(x = 4)");
     checkEvalError(input, env, "Keyword arguments are not allowed when calling a java method"
         + "\nwhile calling method 'compare_to' on object 3 of type int");
   }
 
+  @Test
   public void testNoJavaCallsWithoutSkylark() throws Exception {
     List<Statement> input = parseFileForSkylark("s = 3.to_string()\n");
     checkEvalError(input, env, "No matching method found for to_string() in int");
   }
 
+  @Test
   public void testNoJavaCallsIfClassNotAnnotated() throws Exception {
     env.update("mock", new MockSubClass());
     List<Statement> input = parseFileForSkylark(
@@ -412,6 +445,7 @@
         "No matching method found for is_empty_class_not_annotated(string) in MockSubClass");
   }
 
+  @Test
   public void testStructAccess() throws Exception {
     env.update("mock", new Mock());
     List<Statement> input = parseFileForSkylark(
@@ -420,24 +454,28 @@
     assertEquals("a", env.lookup("v"));
   }
 
+  @Test
   public void testStructAccessAsFuncall() throws Exception {
     env.update("mock", new Mock());
     checkEvalError(parseFileForSkylark("v = mock.struct_field()", MOCK_TYPES), env,
         "No matching method found for struct_field() in Mock");
   }
 
+  @Test
   public void testStructAccessOfMethod() throws Exception {
     env.update("mock", new Mock());
     checkEvalError(parseFileForSkylark(
         "v = mock.function", MOCK_TYPES), env, "Object of type 'Mock' has no field 'function'");
   }
 
+  @Test
   public void testJavaFunctionReturnsMutableObject() throws Exception {
     env.update("mock", new Mock());
     List<Statement> input = parseFileForSkylark("mock.return_mutable()", MOCK_TYPES);
     checkEvalError(input, env, "Method 'return_mutable' returns a mutable object (type of Mock)");
   }
 
+  @Test
   public void testJavaFunctionReturnsNullFails() throws Exception {
     env.update("mock", new Mock());
     List<Statement> input = parseFileForSkylark("mock.nullfunc_failing('abc', 1)", MOCK_TYPES);
@@ -445,30 +483,35 @@
         + " please contact Skylark developers: nullfunc_failing(\"abc\", 1)");
   }
 
+  @Test
   public void testClassObjectAccess() throws Exception {
     env.update("mock", new MockClassObject());
     exec(parseFileForSkylark("v = mock.field", MOCK_TYPES), env);
     assertEquals("a", env.lookup("v"));
   }
 
+  @Test
   public void testClassObjectCannotAccessNestedSet() throws Exception {
     env.update("mock", new MockClassObject());
     checkEvalError(parseFileForSkylark("v = mock.nset", MOCK_TYPES), env,
         "Type is not allowed in Skylark: EmptyNestedSet");
   }
 
+  @Test
   public void testJavaFunctionReturnsNone() throws Exception {
     env.update("mock", new Mock());
     exec(parseFileForSkylark("v = mock.nullfunc_working()", MOCK_TYPES), env);
     assertSame(Environment.NONE, env.lookup("v"));
   }
 
+  @Test
   public void testVoidJavaFunctionReturnsNone() throws Exception {
     env.update("mock", new Mock());
     exec(parseFileForSkylark("v = mock.voidfunc()", MOCK_TYPES), env);
     assertSame(Environment.NONE, env.lookup("v"));
   }
 
+  @Test
   public void testAugmentedAssignment() throws Exception {
     exec(parseFileForSkylark(
         "def f1(x):\n"
@@ -479,6 +522,7 @@
     assertEquals(42, env.lookup("foo"));
   }
 
+  @Test
   public void testStaticDirectJavaCall() throws Exception {
     List<Statement> input = parseFileForSkylark(
         "val = Mock.value_of('8')", MOCK_TYPES);
@@ -488,6 +532,7 @@
     assertEquals(8, env.lookup("val"));
   }
 
+  @Test
   public void testStaticDirectJavaCallMethodIsNonStatic() throws Exception {
     List<Statement> input = parseFileForSkylark(
         "val = Mock.is_empty('a')", MOCK_TYPES);
@@ -496,6 +541,7 @@
     checkEvalError(input, env, "Method 'is_empty' is not static");
   }
 
+  @Test
   public void testDictComprehensions_IterationOrder() throws Exception {
     List<Statement> input = parseFileForSkylark(
         "def foo():\n"
@@ -509,11 +555,13 @@
     assertEquals("cab", env.lookup("s"));
   }
 
+  @Test
   public void testStructCreation() throws Exception {
     exec(parseFileForSkylark("x = struct(a = 1, b = 2)"), env);
     assertThat(env.lookup("x")).isInstanceOf(ClassObject.class);
   }
 
+  @Test
   public void testStructFields() throws Exception {
     exec(parseFileForSkylark("x = struct(a = 1, b = 2)"), env);
     ClassObject x = (ClassObject) env.lookup("x");
@@ -521,6 +569,7 @@
     assertEquals(2, x.getValue("b"));
   }
 
+  @Test
   public void testStructAccessingFieldsFromSkylark() throws Exception {
     exec(parseFileForSkylark(
           "x = struct(a = 1, b = 2)\n"
@@ -530,12 +579,14 @@
     assertEquals(2, env.lookup("x2"));
   }
 
+  @Test
   public void testStructAccessingUnknownField() throws Exception {
     checkEvalError(parseFileForSkylark(
           "x = struct(a = 1, b = 2)\n"
         + "y = x.c\n"), env, "Object of type 'struct' has no field 'c'");
   }
 
+  @Test
   public void testStructAccessingFieldsWithArgs() throws Exception {
     checkEvalError(parseFileForSkylark(
           "x = struct(a = 1, b = 2)\n"
@@ -543,12 +594,14 @@
         env, "No matching method found for a(int) in struct");
   }
 
+  @Test
   public void testStructPosArgs() throws Exception {
     checkEvalError(parseFileForSkylark(
           "x = struct(1, b = 2)\n"),
         env, "struct only supports keyword arguments");
   }
 
+  @Test
   public void testStructConcatenationFieldNames() throws Exception {
     exec(parseFileForSkylark(
           "x = struct(a = 1, b = 2)\n"
@@ -558,6 +611,7 @@
     assertEquals(ImmutableSet.of("a", "b", "c", "d"), z.getKeys());
   }
 
+  @Test
   public void testStructConcatenationFieldValues() throws Exception {
     exec(parseFileForSkylark(
           "x = struct(a = 1, b = 2)\n"
@@ -570,6 +624,7 @@
     assertEquals(2, z.getValue("d"));
   }
 
+  @Test
   public void testStructConcatenationCommonFields() throws Exception {
     checkEvalError(parseFileForSkylark(
           "x = struct(a = 1, b = 2)\n"
@@ -577,11 +632,13 @@
         + "z = x + y\n"), env, "Cannot concat structs with common field(s): a");
   }
 
+  @Test
   public void testDotExpressionOnNonStructObject() throws Exception {
     checkEvalError(parseFileForSkylark(
           "x = 'a'.field"), env, "Object of type 'string' has no field 'field'");
   }
 
+  @Test
   public void testPlusEqualsOnDict() throws Exception {
     MethodLibrary.setupMethodEnvironment(env);
     exec(parseFileForSkylark(
@@ -593,6 +650,7 @@
     assertEquals(ImmutableMap.of("a", 1, "b", 2), env.lookup("d"));
   }
 
+  @Test
   public void testDictAssignmentAsLValue() throws Exception {
     exec(parseFileForSkylark(
           "def func():\n"
@@ -603,6 +661,7 @@
     assertEquals(ImmutableMap.of("a", 1, "b", 2), env.lookup("d"));
   }
 
+  @Test
   public void testDictAssignmentAsLValueNoSideEffects() throws Exception {
     MethodLibrary.setupMethodEnvironment(env);
     exec(parseFileForSkylark(
@@ -613,6 +672,7 @@
     assertEquals(ImmutableMap.of("a", 1), env.lookup("d"));
   }
 
+  @Test
   public void testListIndexAsLValueAsLValue() throws Exception {
     checkEvalError(parseFileForSkylark(
           "def id(l):\n"
@@ -624,6 +684,7 @@
         + "l = func()"), env, "unsupported operand type(s) for +: 'list' and 'dict'");
   }
 
+  @Test
   public void testTopLevelDict() throws Exception {
     exec(parseFileForSkylark(
         "if 1:\n"
@@ -633,6 +694,7 @@
     assertEquals("a", env.lookup("v"));
   }
 
+  @Test
   public void testUserFunctionKeywordArgs() throws Exception {
     exec(parseFileForSkylark(
         "def foo(a, b, c):\n"
@@ -641,6 +703,7 @@
     assertEquals(6, env.lookup("s"));
   }
 
+  @Test
   public void testNoneTrueFalseInSkylark() throws Exception {
     exec(parseFileForSkylark(
         "a = None\n"
@@ -651,6 +714,7 @@
     assertFalse((Boolean) env.lookup("c"));
   }
 
+  @Test
   public void testHasattr() throws Exception {
     exec(parseFileForSkylark(
         "s = struct(a=1)\n"
@@ -660,6 +724,7 @@
     assertFalse((Boolean) env.lookup("y"));
   }
 
+  @Test
   public void testHasattrMethods() throws Exception {
     env.update("mock", new Mock());
     ValidationEnvironment validEnv = SkylarkModules.getValidationEnvironment();
@@ -678,6 +743,7 @@
     assertFalse((Boolean) env.lookup("e"));
   }
 
+  @Test
   public void testGetattr() throws Exception {
     exec(parseFileForSkylark(
         "s = struct(a='val')\n"
@@ -691,6 +757,7 @@
     assertEquals("val", env.lookup("w"));
   }
 
+  @Test
   public void testGetattrNoAttr() throws Exception {
     checkEvalError(parseFileForSkylark(
           "s = struct(a='val')\n"
@@ -699,17 +766,20 @@
   }
 
   @SuppressWarnings("unchecked")
+  @Test
   public void testListAnTupleConcatenationDoesNotWorkInSkylark() throws Exception {
     checkEvalError(parseFileForSkylark("[1, 2] + (3, 4)"), env,
         "cannot concatenate lists and tuples");
   }
 
+  @Test
   public void testCannotCreateMixedListInSkylark() throws Exception {
     env.update("mock", new Mock());
     checkEvalError(parseFileForSkylark("[mock.string(), 1, 2]", MOCK_TYPES), env,
         "Incompatible types in list: found a int but the previous elements were strings");
   }
 
+  @Test
   public void testCannotConcatListInSkylarkWithDifferentGenericTypes() throws Exception {
     env.update("mock", new Mock());
     checkEvalError(parseFileForSkylark("mock.string_list() + [1, 2]", MOCK_TYPES), env,
@@ -717,17 +787,20 @@
   }
 
   @SuppressWarnings("unchecked")
+  @Test
   public void testConcatEmptyListWithNonEmptyWorks() throws Exception {
     exec(parseFileForSkylark("l = [] + ['a', 'b']", MOCK_TYPES), env);
     assertThat((Iterable<Object>) env.lookup("l")).containsExactly("a", "b").inOrder();
   }
 
+  @Test
   public void testFormatStringWithTuple() throws Exception {
     exec(parseFileForSkylark("v = '%s%s' % ('a', 1)"), env);
     assertEquals("a1", env.lookup("v"));
   }
 
   @SuppressWarnings("unchecked")
+  @Test
   public void testDirFindsClassObjectFields() throws Exception {
     env.update("mock", new MockClassObject());
     exec(parseFileForSkylark("v = dir(mock)", MOCK_TYPES), env);
@@ -735,6 +808,7 @@
   }
 
   @SuppressWarnings("unchecked")
+  @Test
   public void testDirFindsJavaObjectStructFieldsAndMethods() throws Exception {
     env.update("mock", new Mock());
     exec(parseFileForSkylark("v = dir(mock)", MOCK_TYPES), env);
@@ -743,6 +817,7 @@
         "struct_field", "value_of", "voidfunc").inOrder();
   }
 
+  @Test
   public void testPrint() throws Exception {
     exec(parseFileForSkylark("print('hello')"), env);
     syntaxEvents.assertContainsEvent("hello");
@@ -752,10 +827,12 @@
     syntaxEvents.assertContainsEvent("axb");
   }
 
+  @Test
   public void testPrintBadKwargs() throws Exception {
     checkEvalError("print(end='x', other='y')", "unexpected keywords: '[end, other]'");
   }
 
+  @Test
   public void testSkylarkTypes() {
     assertEquals(TransitiveInfoCollection.class,
         EvalUtils.getSkylarkType(FileConfiguredTarget.class));
@@ -768,6 +845,7 @@
 
   @SuppressWarnings("unchecked")
   @Override
+  @Test
   public void testConcatLists() throws Exception {
     // list
     Object x = eval("[1,2] + [3,4]");
@@ -786,14 +864,17 @@
 
   @SuppressWarnings("unchecked")
   @Override
+  @Test
   public void testListExprs() throws Exception {
     assertThat((Iterable<Object>) eval("[1, 2, 3]")).containsExactly(1, 2, 3).inOrder();
     assertThat((Iterable<Object>) eval("(1, 2, 3)")).containsExactly(1, 2, 3).inOrder();
   }
 
   @Override
+  @Test
   public void testListConcatenation() throws Exception {}
 
   @Override
+  @Test
   public void testKeywordArgs() {}
 }
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 2347198..e3ee1e1 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
@@ -13,16 +13,26 @@
 // limitations under the License.
 package com.google.devtools.build.lib.syntax;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
 import com.google.common.base.Joiner;
 import com.google.common.collect.ImmutableMap;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.packages.MethodLibrary;
 
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
 import java.util.Iterator;
 
 /**
  * Tests for SkylarkList.
  */
+@RunWith(JUnit4.class)
 public class SkylarkListTest extends AbstractEvaluationTestCase {
 
   @Immutable
@@ -43,31 +53,36 @@
 
   private Environment env;
 
-  @Override
-  protected void setUp() throws Exception {
-    super.setUp();
+  @Before
+  public void setUp() throws Exception {
+
     env = new SkylarkEnvironment(syntaxEvents.collector());
     env.update("lazy", list);
     MethodLibrary.setupMethodEnvironment(env);
   }
 
+  @Test
   public void testLazyListIndex() throws Exception {
     checkError("Iterator requested", "a = lazy[0]");
   }
 
+  @Test
   public void testLazyListSize() throws Exception {
     checkError("Iterator requested", "a = len(lazy)");
   }
 
+  @Test
   public void testLazyListEmpty() throws Exception {
     checkError("Iterator requested", "if lazy:\n  a = 1");
   }
 
+  @Test
   public void testLazyListConcat() throws Exception {
     exec("v = [1, 2] + lazy");
     assertTrue(env.lookup("v") instanceof SkylarkList);
   }
 
+  @Test
   public void testConcatListIndex() throws Exception {
     exec("l = [1, 2] + [3, 4]",
          "e0 = l[0]",
@@ -80,6 +95,7 @@
     assertEquals(4, env.lookup("e3"));
   }
 
+  @Test
   public void testConcatListHierarchicalIndex() throws Exception {
     exec("l = [1] + (([2] + [3, 4]) + [5])",
          "e0 = l[0]",
@@ -94,18 +110,21 @@
     assertEquals(5, env.lookup("e4"));
   }
 
+  @Test
   public void testConcatListSize() throws Exception {
     exec("l = [1, 2] + [3, 4]",
          "s = len(l)");
     assertEquals(4, env.lookup("s"));
   }
 
+  @Test
   public void testConcatListToString() throws Exception {
     exec("l = [1, 2] + [3, 4]",
          "s = str(l)");
     assertEquals("[1, 2, 3, 4]", env.lookup("s"));
   }
 
+  @Test
   public void testConcatListNotEmpty() throws Exception {
     exec("l = [1, 2] + [3, 4]",
         "if l:",
@@ -115,6 +134,7 @@
     assertEquals(1, env.lookup("v"));
   }
 
+  @Test
   public void testConcatListEmpty() throws Exception {
     exec("l = [] + []",
         "if l:",
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 622f044..48a5672 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
@@ -13,41 +13,55 @@
 // limitations under the License.
 package com.google.devtools.build.lib.syntax;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
 import com.google.common.base.Joiner;
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.collect.nestedset.Order;
 import com.google.devtools.build.lib.packages.MethodLibrary;
 import com.google.devtools.build.lib.syntax.Environment.NoSuchVariableException;
 
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
 /**
  * Tests for SkylarkNestedSet.
  */
+@RunWith(JUnit4.class)
 public class SkylarkNestedSetTest extends AbstractEvaluationTestCase {
 
   private Environment env;
 
-  @Override
-  protected void setUp() throws Exception {
-    super.setUp();
+  @Before
+  public void setUp() throws Exception {
+
     env = new SkylarkEnvironment(syntaxEvents.collector());
     MethodLibrary.setupMethodEnvironment(env);
   }
 
+  @Test
   public void testNsetBuilder() throws Exception {
     exec("n = set(order='stable')");
     assertTrue(env.lookup("n") instanceof SkylarkNestedSet);
   }
 
+  @Test
   public void testNsetOrder() throws Exception {
     exec("n = set(['a', 'b'], order='compile')");
     assertEquals(Order.COMPILE_ORDER, get("n").getSet(String.class).getOrder());
   }
 
+  @Test
   public void testEmptyNsetGenericType() throws Exception {
     exec("n = set()");
     assertEquals(SkylarkType.TOP, get("n").getContentType());
   }
 
+  @Test
   public void testFunctionReturnsNset() throws Exception {
     exec("def func():",
          "  n = set()",
@@ -57,6 +71,7 @@
     assertEquals(ImmutableList.of("a"), get("s").toCollection());
   }
 
+  @Test
   public void testNsetTwoReferences() throws Exception {
     exec("def func():",
          "  n1 = set()",
@@ -68,6 +83,7 @@
     assertEquals(ImmutableList.of("a"), get("n").toCollection());
   }
 
+  @Test
   public void testNsetNestedItem() throws Exception {
     exec("def func():",
         "  n1 = set()",
@@ -80,11 +96,13 @@
     assertEquals(ImmutableList.of("b", "a"), get("n").toCollection());
   }
 
+  @Test
   public void testNsetNestedItemBadOrder() throws Exception {
     checkError("LINK_ORDER != COMPILE_ORDER",
         "set(['a', 'b'], order='compile') + set(['c', 'd'], order='link')");
   }
 
+  @Test
   public void testNsetItemList() throws Exception {
     exec("def func():",
         "  n = set()",
@@ -94,6 +112,7 @@
     assertEquals(ImmutableList.of("a", "b"), get("n").toCollection());
   }
 
+  @Test
   public void testNsetFuncParamNoSideEffects() throws Exception {
     exec("def func1(n):",
         "  n += ['b']",
@@ -106,6 +125,7 @@
     assertEquals(ImmutableList.of("a"), get("n").toCollection());
   }
 
+  @Test
   public void testNsetTransitiveOrdering() throws Exception {
     exec("def func():",
         "  na = set(['a'], order='compile')",
@@ -117,6 +137,7 @@
     assertEquals(ImmutableList.of("b", "a", "c"), get("n").toCollection());
   }
 
+  @Test
   public void testNsetOrdering() throws Exception {
     exec("def func():",
         "  na = set()",
@@ -129,22 +150,26 @@
     assertEquals(ImmutableList.of(4, 2, 3, 5), get("n").toCollection());
   }
 
+  @Test
   public void testNsetBadOrder() throws Exception {
     checkError("Invalid order: non_existing",
         "set(order='non_existing')");
   }
 
+  @Test
   public void testNsetBadRightOperand() throws Exception {
     checkError("cannot add 'string'-s to nested sets",
         "l = ['a']\n",
         "set() + l[0]");
   }
 
+  @Test
   public void testNsetBadCompositeItem() throws Exception {
     checkError("nested set item is composite (type of struct)",
         "set([struct(a='a')])");
   }
 
+  @Test
   public void testNsetToString() throws Exception {
     exec("s = set() + [2, 4, 6] + [3, 4, 5]",
         "x = str(s)");
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/ValidationTests.java b/src/test/java/com/google/devtools/build/lib/syntax/ValidationTests.java
index 49c552e..62b0d85 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/ValidationTests.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/ValidationTests.java
@@ -15,11 +15,17 @@
 
 import com.google.common.base.Joiner;
 
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
 /**
  * Tests for the validation process of Skylark files.
  */
+@RunWith(JUnit4.class)
 public class ValidationTests extends AbstractParserTestCase {
 
+  @Test
   public void testIncompatibleLiteralTypesStringInt() {
     checkError("bad variable 'a': int is incompatible with string at /some/file.txt",
         "def foo():\n",
@@ -27,6 +33,7 @@
         "  a = 1");
   }
 
+  @Test
   public void testIncompatibleLiteralTypesDictString() {
     checkError("bad variable 'a': int is incompatible with dict of ints at /some/file.txt:3:3",
         "def foo():\n",
@@ -34,6 +41,7 @@
         "  a = 1");
   }
 
+  @Test
   public void testIncompatibleLiteralTypesInIf() {
     checkError("bad variable 'a': int is incompatible with string at /some/file.txt",
         "def foo():\n",
@@ -43,47 +51,56 @@
         "    a = 1");
   }
 
+  @Test
   public void testAssignmentNotValidLValue() {
     checkError("can only assign to variables, not to ''a''", "'a' = 1");
   }
 
+  @Test
   public void testForNotIterable() throws Exception {
     checkError("type 'int' is not iterable",
           "def func():\n"
         + "  for i in 5: a = i\n");
   }
 
+  @Test
   public void testForIterableWithUknownArgument() throws Exception {
     parse("def func(x=None):\n"
         + "  for i in x: a = i\n");
   }
 
+  @Test
   public void testForNotIterableBinaryExpression() throws Exception {
     checkError("type 'int' is not iterable",
           "def func():\n"
         + "  for i in 1 + 1: a = i\n");
   }
 
+  @Test
   public void testOptionalArgument() throws Exception {
     checkError("type 'int' is not iterable",
           "def func(x=5):\n"
         + "  for i in x: a = i\n");
   }
 
+  @Test
   public void testOptionalArgumentHasError() throws Exception {
     checkError("unsupported operand type(s) for +: 'int' and 'string'",
           "def func(x=5+'a'):\n"
         + "  return 0\n");
   }
 
+  @Test
   public void testTopLevelForStatement() throws Exception {
     checkError("'For' is not allowed as a top level statement", "for i in [1,2,3]: a = i\n");
   }
 
+  @Test
   public void testReturnOutsideFunction() throws Exception {
     checkError("Return statements must be inside a function", "return 2\n");
   }
 
+  @Test
   public void testTwoReturnTypes() throws Exception {
     checkError("bad return type of foo: string is incompatible with int at /some/file.txt:3:5",
         "def foo(x):",
@@ -93,6 +110,7 @@
         "    return 'a'");
   }
 
+  @Test
   public void testTwoFunctionsWithTheSameName() throws Exception {
     checkError("function foo already exists",
         "def foo():",
@@ -101,6 +119,7 @@
         "  return 1");
   }
 
+  @Test
   public void testDynamicTypeCheck() throws Exception {
     checkError("bad variable 'a': string is incompatible with int at /some/file.txt:2:3",
         "def foo():",
@@ -108,6 +127,7 @@
         "  a = '1'");
   }
 
+  @Test
   public void testFunctionLocalVariable() throws Exception {
     checkError("name 'a' is not defined",
         "def func2(b):",
@@ -118,6 +138,7 @@
         "  func2(2)");
   }
 
+  @Test
   public void testFunctionLocalVariableDoesNotEffectGlobalValidationEnv() throws Exception {
     checkError("name 'a' is not defined",
         "def func1():",
@@ -126,6 +147,7 @@
         "  b = a");
   }
 
+  @Test
   public void testFunctionParameterDoesNotEffectGlobalValidationEnv() throws Exception {
     checkError("name 'a' is not defined",
         "def func1(a):",
@@ -134,6 +156,7 @@
         "  b = a");
   }
 
+  @Test
   public void testLocalValidationEnvironmentsAreSeparated() throws Exception {
     parse(
           "def func1():\n"
@@ -142,49 +165,59 @@
         + "  a = 'abc'\n");
   }
 
+  @Test
   public void testListComprehensionNotIterable() throws Exception {
     checkError("type 'int' is not iterable",
         "[i for i in 1 for j in [2]]");
   }
 
+  @Test
   public void testListComprehensionNotIterable2() throws Exception {
     checkError("type 'int' is not iterable",
         "[i for i in [1] for j in 123]");
   }
 
+  @Test
   public void testListIsNotComparable() {
     checkError("list of strings is not comparable", "['a'] > 1");
   }
 
+  @Test
   public void testStringCompareToInt() {
     checkError("bad comparison: int is incompatible with string", "'a' > 1");
   }
 
+  @Test
   public void testInOnInt() {
     checkError("operand 'in' only works on strings, dictionaries, "
         + "lists, sets or tuples, not on a(n) int", "1 in 2");
   }
 
+  @Test
   public void testUnsupportedOperator() {
     checkError("unsupported operand type(s) for -: 'string' and 'int'", "'a' - 1");
   }
 
+  @Test
   public void testBuiltinSymbolsAreReadOnly() throws Exception {
     checkError("Variable rule is read only", "rule = 1");
   }
 
+  @Test
   public void testSkylarkGlobalVariablesAreReadonly() throws Exception {
     checkError("Variable a is read only",
         "a = 1\n"
         + "a = 2");
   }
 
+  @Test
   public void testFunctionDefRecursion() throws Exception {
     checkError("function 'func' does not exist",
         "def func():\n"
       + "  func()\n");
   }
 
+  @Test
   public void testMutualRecursion() throws Exception {
     checkError("function 'bar' does not exist",
         "def foo(i):\n"
@@ -194,36 +227,42 @@
       + "foo(4)");
   }
 
+  @Test
   public void testFunctionReturnValue() {
     checkError("unsupported operand type(s) for +: 'int' and 'string'",
           "def foo(): return 1\n"
         + "a = foo() + 'a'\n");
   }
 
+  @Test
   public void testFunctionReturnValueInFunctionDef() {
     checkError("unsupported operand type(s) for +: 'int' and 'string'",
           "def foo(): return 1\n"
         + "def bar(): a = foo() + 'a'\n");
   }
 
+  @Test
   public void testFunctionDoesNotExistInFunctionDef() {
     checkError("function 'foo' does not exist",
           "def bar(): a = foo() + 'a'\n"
         + "def foo(): return 1\n");
   }
 
+  @Test
   public void testStructMembersAreImmutable() {
     checkError("can only assign to variables, not to 's.x'",
         "s = struct(x = 'a')\n"
       + "s.x = 'b'\n");
   }
 
+  @Test
   public void testStructDictMembersAreImmutable() {
     checkError("can only assign to variables, not to 's.x['b']'",
         "s = struct(x = {'a' : 1})\n"
       + "s.x['b'] = 2\n");
   }
 
+  @Test
   public void testTupleAssign() throws Exception {
     // TODO(bazel-team): fix our code so 'tuple' not 'list' gets printed.
     checkError("unsupported operand type(s) for +: 'list' and 'dict of ints'",
@@ -231,29 +270,34 @@
       + "d[0] = 2\n");
   }
 
+  @Test
   public void testAssignOnNonCollection() throws Exception {
     checkError("unsupported operand type(s) for +: 'string' and 'dict of ints'",
         "d = 'abc'\n"
       + "d[0] = 2");
   }
 
+  @Test
   public void testNsetBadRightOperand() throws Exception {
     checkError("can only concatenate nested sets with other nested sets or list of items, "
         + "not 'string'", "set() + 'a'");
   }
 
+  @Test
   public void testNsetBadItemType() throws Exception {
     checkError("bad nested set: set of ints is incompatible with set of strings "
         + "at /some/file.txt:1:1",
         "(set() + ['a']) + [1]");
   }
 
+  @Test
   public void testNsetBadNestedItemType() throws Exception {
     checkError("bad nested set: set of ints is incompatible with set of strings "
         + "at /some/file.txt:1:1",
         "(set() + ['b']) + (set() + [1])");
   }
 
+  @Test
   public void testTypeInferenceForMethodLibraryFunction() throws Exception {
     checkError("bad variable 'l': string is incompatible with int at /some/file.txt:2:3",
           "def foo():\n"
@@ -261,62 +305,75 @@
         + "  l = 'a'");
   }
 
+  @Test
   public void testListLiteralBadTypes() throws Exception {
     checkError("bad list literal: int is incompatible with string at /some/file.txt:1:1",
         "['a', 1]");
   }
 
+  @Test
   public void testTupleLiteralWorksForDifferentTypes() throws Exception {
     parse("('a', 1)");
   }
 
+  @Test
   public void testDictLiteralBadKeyTypes() throws Exception {
     checkError("bad dict literal: int is incompatible with string at /some/file.txt:1:1",
         "{'a': 1, 1: 2}");
   }
 
+  @Test
   public void testDictLiteralDifferentValueTypeWorks() throws Exception {
     parse("{'a': 1, 'b': 'c'}");
   }
 
+  @Test
   public void testListConcatBadTypes() throws Exception {
     checkError("bad list concatenation: list of ints is incompatible with list of strings"
         + " at /some/file.txt:1:1",
         "['a'] + [1]");
   }
 
+  @Test
   public void testDictConcatBadKeyTypes() throws Exception {
     checkError("bad dict concatenation: dict of ints is incompatible with dict of strings "
         + "at /some/file.txt:1:1",
         "{'a': 1} + {1: 2}");
   }
 
+  @Test
   public void testDictLiteralBadKeyType() throws Exception {
     checkError("Dict cannot contain composite type 'list of strings' as key", "{['a']: 1}");
   }
 
+  @Test
   public void testAndTypeInfer() throws Exception {
     checkError("unsupported operand type(s) for +: 'string' and 'int'", "('a' and 'b') + 1");
   }
 
+  @Test
   public void testOrTypeInfer() throws Exception {
     checkError("unsupported operand type(s) for +: 'string' and 'int'", "('' or 'b') + 1");
   }
 
+  @Test
   public void testAndDifferentTypes() throws Exception {
     checkError("bad and operator: int is incompatible with string at /some/file.txt:1:1",
         "'ab' and 3");
   }
 
+  @Test
   public void testOrDifferentTypes() throws Exception {
     checkError("bad or operator: int is incompatible with string at /some/file.txt:1:1",
         "'ab' or 3");
   }
 
+  @Test
   public void testOrNone() throws Exception {
     parse("a = None or 3");
   }
 
+  @Test
   public void testNoneAssignment() throws Exception {
     parse("def func():\n"
         + "  a = None\n"
@@ -324,6 +381,7 @@
         + "  a = None\n");
   }
 
+  @Test
   public void testNoneAssignmentError() throws Exception {
     checkError("bad variable 'a': string is incompatible with int at /some/file.txt",
           "def func():\n"
@@ -333,10 +391,12 @@
         + "  a = 'b'\n");
   }
 
+  @Test
   public void testDictComprehensionNotOnList() throws Exception {
     checkError("Dict comprehension elements must be a list", "{k : k for k in 'abc'}");
   }
 
+  @Test
   public void testTypeInferenceForUserDefinedFunction() throws Exception {
     checkError("bad variable 'a': string is incompatible with int at /some/file.txt",
           "def func():\n"
@@ -346,12 +406,14 @@
         + "  a = func()\n");
   }
 
+  @Test
   public void testCallingNonFunction() {
     checkError("a is not a function",
         "a = '1':\n"
       + "a()\n");
   }
 
+  @Test
   public void testFuncallArgument() {
     checkError("unsupported operand type(s) for +: 'int' and 'string'",
         "def foo(x): return x\n"
@@ -360,6 +422,7 @@
 
   // Skylark built-in functions specific tests
 
+  @Test
   public void testTypeInferenceForSkylarkBuiltinGlobalFunction() throws Exception {
     checkError("bad variable 'a': string is incompatible with function at /some/file.txt:3:3",
           "def impl(ctx): return None\n"
@@ -368,6 +431,7 @@
         + "  a = 'a'\n");
   }
 
+  @Test
   public void testTypeInferenceForSkylarkBuiltinObjectFunction() throws Exception {
     checkError("bad variable 'a': string is incompatible with Attribute at /some/file.txt",
         "def foo():\n"
@@ -375,6 +439,7 @@
         + "  a = 'a'\n");
   }
 
+  @Test
   public void testFuncReturningDictAssignmentAsLValue() throws Exception {
     checkError("can only assign to variables, not to 'dict([])['b']'",
           "def dict():\n"
@@ -384,6 +449,7 @@
         + "  return d\n");
   }
 
+  @Test
   public void testListIndexAsLValue() {
     checkError("unsupported operand type(s) for +: 'list of ints' and 'dict of ints'",
         "def func():\n"
@@ -392,6 +458,7 @@
       + "  return l\n");
   }
 
+  @Test
   public void testStringIndexAsLValue() {
     checkError("unsupported operand type(s) for +: 'string' and 'dict of ints'",
         "def func():\n"
@@ -400,17 +467,20 @@
       + "  return s\n");
   }
 
+  @Test
   public void testEmptyLiteralGenericIsSetInLaterConcatWorks() {
     parse("def func():\n"
         + "  s = {}\n"
         + "  s['a'] = 'b'\n");
   }
 
+  @Test
   public void testTypeIsInferredForStructs() {
     checkError("unsupported operand type(s) for +: 'struct' and 'string'",
         "(struct(a = 1) + struct(b = 1)) + 'x'");
   }
 
+  @Test
   public void testReadOnlyWorksForSimpleBranching() {
     parse("if 1:\n"
         + "  v = 'a'\n"
@@ -418,6 +488,7 @@
         + "  v = 'b'");
   }
 
+  @Test
   public void testReadOnlyWorksForNestedBranching() {
     parse("if 1:\n"
         + "  if 0:\n"
@@ -431,6 +502,7 @@
         + "    v = 'd'\n");
   }
 
+  @Test
   public void testTypeCheckWorksForSimpleBranching() {
     checkError("bad variable 'v': int is incompatible with string at /some/file.txt:2:3",
           "if 1:\n"
@@ -439,6 +511,7 @@
         + "  v = 1");
   }
 
+  @Test
   public void testTypeCheckWorksForNestedBranching() {
     checkError("bad variable 'v': int is incompatible with string at /some/file.txt:5:5",
         "if 1:\n"
@@ -450,6 +523,7 @@
       + "    v = 1\n");
   }
 
+  @Test
   public void testTypeCheckWorksForDifferentLevelBranches() {
     checkError("bad variable 'v': int is incompatible with string at /some/file.txt:2:3",
         "if 1:\n"
@@ -459,6 +533,7 @@
       + "    v = 1\n");
   }
 
+  @Test
   public void testReadOnlyWorksForDifferentLevelBranches() {
     checkError("Variable v is read only",
         "if 1:\n"
@@ -467,6 +542,7 @@
       + "  v = 'b'\n");
   }
 
+  @Test
   public void testReadOnlyWorksWithinSimpleBranch() {
     checkError("Variable v is read only",
         "if 1:\n"
@@ -476,6 +552,7 @@
       + "  v = 'c'\n");
   }
 
+  @Test
   public void testReadOnlyWorksWithinNestedBranch() {
     checkError("Variable v is read only",
         "if 1:\n"
@@ -488,6 +565,7 @@
       + "    v = 'd'\n");
   }
 
+  @Test
   public void testReadOnlyWorksAfterSimpleBranch() {
     checkError("Variable v is read only",
         "if 1:\n"
@@ -497,6 +575,7 @@
       + "v = 'b'");
   }
 
+  @Test
   public void testReadOnlyWorksAfterNestedBranch() {
     checkError("Variable v is read only",
         "if 1:\n"
@@ -505,6 +584,7 @@
       + "v = 'b'");
   }
 
+  @Test
   public void testReadOnlyWorksAfterNestedBranch2() {
     checkError("Variable v is read only",
         "if 1:\n"
@@ -515,29 +595,34 @@
       + "v = 'b'\n");
   }
 
+  @Test
   public void testModulesReadOnlyInFuncDefBody() {
     checkError("Variable cmd_helper is read only",
         "def func():",
         "  cmd_helper = set()");
   }
 
+  @Test
   public void testBuiltinGlobalFunctionsReadOnlyInFuncDefBody() {
     checkError("Variable rule is read only",
         "def func():",
         "  rule = 'abc'");
   }
 
+  @Test
   public void testBuiltinGlobalFunctionsReadOnlyAsFuncDefArg() {
     checkError("Variable rule is read only",
         "def func(rule):",
         "  return rule");
   }
 
+  @Test
   public void testFilesModulePlusStringErrorMessage() throws Exception {
     checkError("unsupported operand type(s) for +: 'cmd_helper (a language module)' and 'string'",
         "cmd_helper += 'a'");
   }
 
+  @Test
   public void testFunctionReturnsFunction() {
     parse(
         "def impl(ctx):",
@@ -549,19 +634,23 @@
         "  skylark_rule(name = name)");
   }
 
+  @Test
   public void testTypeForBooleanLiterals() {
     parse("len([1, 2]) == 0 and True");
     parse("len([1, 2]) == 0 and False");
   }
 
+  @Test
   public void testLoadRelativePathOneSegment() throws Exception {
     parse("load('extension', 'a')\n");
   }
 
+  @Test
   public void testLoadAbsolutePathMultipleSegments() throws Exception {
     parse("load('/pkg/extension', 'a')\n");
   }
 
+  @Test
   public void testLoadRelativePathMultipleSegments() throws Exception {
     checkError("Path 'pkg/extension.bzl' is not valid. It should either start with "
         + "a slash or refer to a file in the current directory.",
