查找JUnit TestCase中的测试方法数

时间:2009-02-11 08:38:36

标签: java junit

有没有办法知道测试用例中的测试方法数量?

我想要做的是有一个测试案例,测试几个场景,对于所有这些,我只会做一次数据setUp()。同样,我想在所有测试方法结束时进行一次清理(tearDown())。

我正在使用的当前方法是为文件中存在的测试方法的数量维护一个计数器,并在tearDown方法中递减它们,并在计数达到0时进行清理。但是需要使用此计数器每当添加新的测试方法时都要小心。

7 个答案:

答案 0 :(得分:6)

您应该使用注释为@BeforeClass和@AfterClass的方法,而不是使用setup / teardown。

答案 1 :(得分:4)

你可以通过JUnit4中的@BeforeClass和@AfterClass来做到这一点: http://junit.org/apidocs/org/junit/BeforeClass.html

沃尔克

答案 2 :(得分:2)

这是我编写的代码片段,用于查找JUnit项目中的所有测试用例。它的作用是读取文件(在代码中提到的包下)并使用反射API,找到注释为“@Test”的测试用例以及以“test”开头但没有@Test注释的测试用例

public class TestCaseCount {

      private static List<Class> getClasses(String packageName)
          throws ClassNotFoundException, IOException {
        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
        assert classLoader != null;
        String path = packageName.replace('.', '/');
        Enumeration<URL> resources = classLoader.getResources(path);
        List<File> dirs = new ArrayList<File>();
        while (resources.hasMoreElements()) {
          URL resource = resources.nextElement();
          dirs.add(new File(resource.getFile()));
        }

        ArrayList<Class> classes = new ArrayList<Class>();
        for (File directory : dirs) {
          classes.addAll(findClasses(directory, packageName));
        }
        return classes /* .toArray(new Class[classes.size()]) */;
      }

      private static List<Class> findClasses(File directory, String packageName)
          throws ClassNotFoundException {
        List<Class> classes = new ArrayList<Class>();
        if (!directory.exists()) {
          return classes;
        }

        File[] files = directory.listFiles();
        for (File file : files) {
          if (file.isDirectory()) {
            assert !file.getName().contains(".");
            classes.addAll(findClasses(file, packageName + "." + file.getName()));
          } else if (file.getName().endsWith(".class")) {
            classes.add(Class.forName(packageName + '.'
                + file.getName().substring(0, file.getName().length() - 6)));
          }
        }
        return classes;
      }

      public static void main(String args[]) {

        ArrayList<Class> classes = new ArrayList<Class>();

        try {
          // Feature1 Test Cases
          classes.addAll(TestCaseCount.getClasses("mypackage.feature1.tests"));

          // Feature2 Test Cases
          classes.addAll(TestCaseCount.getClasses("mypackage.feature2.tests1"));
          classes.addAll(TestCaseCount.getClasses("mypackage.feature2.tests2"));

          // Feature3 Test Cases
          classes.addAll(TestCaseCount.getClasses("mypackage.feature3.tests"));

        } catch (Exception e) {
          e.printStackTrace();
        }

        int testcaseCount = 0;
        for (Class cl : classes) {
          System.out.println("Test Class Name : " + cl.getName());

          Method[] methods = cl.getDeclaredMethods();

          for (Method method : methods) {
            Annotation[] annotations = method.getDeclaredAnnotations();
            if (annotations.length == 0 && method.getName().startsWith("test")) {
              testcaseCount++;
            } else {
              for (Annotation annotation : annotations) {
                if (annotation.annotationType().toString()
                    .equals("interface org.junit.Test")) {
                  testcaseCount++;
                }
              }
            }
          }
        }
        System.out.println("Total Test Cases " + testcaseCount);
      }
    }

答案 3 :(得分:1)

使用@BeforeClass@AfterClass@Before计算测试的简短示例。

public class CountTest {
  static int count;

  @BeforeClass
  public static void beforeClass() {
    count = 0;
  }

  @Before
  public void countUp() {
    count++;
  }

  @AfterClass
  public static void printCount() {
    System.out.println(count + " tests.");
  }

  @Test
  public void test1() {
    assertTrue(true);
  }
  // some more tests

输出将是,例如:

  

5次测试。

答案 4 :(得分:0)

如果您使用的是Junit4,其他人给出的建议是正确的。但是如果您使用的是早期版本,那么请使用此技术来实现您想要的功能 -

您可以为要设置和拆解的所有测试定义一个套件。看一下junit.extensions.TestSetup类。您需要执行这些套件,而不是执行测试类。

答案 5 :(得分:0)

junit 3的解决方案是在每个检查静态标志的测试中调用特殊的设置方法。如果未设置标志,请运行全局设置。如果是,请跳过设置。

如果要并行运行测试,请确保全局设置已正确同步。

答案 6 :(得分:0)

TestWatcher 上使用 @Rules ,您可以记下计数和许多其他内容,例如方法名称等。您可以覆盖这些方法并使用。

@Override   
public Statement apply(Statement base, Description description){
    return super.apply(base, description);  
}

@Override   
protected void failed(Throwable e, Description description) {
    failed.add(description);
    LogUtil.error("[FAILED] "+description.getMethodName()+" [Test Failed]"+e.getMessage());
    super.failed(e, description);
}

@Override   
protected void finished(Description description) {      
    LogUtil.info("[FINISHED] "+description.getMethodName());
    super.finished(description);
}

@Override    
protected void skipped(AssumptionViolatedException e,Description description) {
    LogUtil.error("[FAILED] Test Failed due to Assumption Voilation "+e.getMessage());
    super.skipped(e,description);
}

@Override
protected void starting(Description description) {
    LogUtil.info("-----------------------------------------------------------");
    LogUtil.info("[STARTED]  "+description.getMethodName());
    super.starting(description);
}

@Override
protected void succeeded(Description description) { 
    passed.add(description);
    LogUtil.info("[PASSED] "+description.getMethodName());
    super.succeeded(description);
}

在Junit Testcase中使用

@Rule
public TestRule watcher = new TestWatcherChild();