public void run() {
		ArrayList<Method> methods = new ArrayList<Method>(Arrays.asList(this.getClass().getMethods()));
		
		for(Method method : methods) {
			String methodName = method.getName();
			if(!ignoredMethods.contains(method.getName())) {
				try {
					beforeEach();
					method.invoke(this);
					
					ArrayList<Test> tests = testsMap.get(methodName);
					
					if(tests != null) {
						ArrayList<String> failures = new ArrayList<String>();
						
						printHeader(methodName);

						for(Test test : tests) {
							test.run();
							if(!test.passed()) {
								failures.add(test.getFailureMessage());
								System.out.print("F");
							} else {
								System.out.print(".");
							}
						}
					
						System.out.println("\n");
						for(String failure : failures)
							System.out.println(failure);
						
						printStats(tests.size(), failures.size());
					}
					
					afterEach();
				} catch (IllegalArgumentException e) {
					System.out.println(e.getLocalizedMessage());
					e.printStackTrace();
				} catch (IllegalAccessException e) {
					System.out.println(e.getLocalizedMessage());
					e.printStackTrace();
				} catch (InvocationTargetException e) {
					System.out.println(e.getTargetException());
					System.out.println(e.getLocalizedMessage());
					e.printStackTrace();
				}
			}
		}
	}