Back to Repositories

Testing Metric Logging Implementation in dianping/cat

This test suite validates the metric logging functionality in Cat’s monitoring system, focusing on count, duration, and sum metrics. The tests ensure accurate metric collection and aggregation across different measurement types.

Test Coverage Overview

The test suite provides comprehensive coverage of Cat’s metric logging capabilities.

Key areas tested include:
  • Count metrics with single and multiple increments
  • Duration measurements with individual and accumulated timings
  • Sum calculations for single and multiple value aggregation
  • Metric type validation across different kinds (COUNT, DURATION, SUM)

Implementation Analysis

The testing approach uses JUnit framework with a component-based structure. Each test method focuses on a specific metric type and validates both single and multiple logging scenarios.

Technical patterns include:
  • Before/After test lifecycle management
  • Test mode bootstrapping
  • Metric assertion utilities
  • Isolated test contexts

Technical Details

Testing infrastructure includes:
  • JUnit test framework
  • Custom ComponentTestCase base class
  • MetricAssert utility for verification
  • Cat bootstrap configuration in test mode
  • Context interceptor for metric validation

Best Practices Demonstrated

The test suite exemplifies several testing best practices:

  • Clear test method naming reflecting functionality
  • Proper test setup and teardown
  • Isolated test cases with specific assertions
  • Comprehensive validation of edge cases
  • Consistent testing patterns across different metric types

dianping/cat

cat-client/src/test/java/com/dianping/cat/message/MetricTest.java

            
package com.dianping.cat.message;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.dianping.cat.Cat;
import com.dianping.cat.ComponentTestCase;
import com.dianping.cat.message.Metric.Kind;

public class MetricTest extends ComponentTestCase {
	@After
	public void after() {
		MetricAssert.reset();
	}

	@Before
	public void before() throws Exception {
		Cat.getBootstrap().testMode();

		MetricAssert.intercept(context());
	}

	@Test
	public void testCount() {
		Cat.logMetricForCount("metric");

		MetricAssert.name("metric").kind(Kind.COUNT).count(1);
	}

	@Test
	public void testCounts() {
		Cat.logMetricForCount("metric");
		Cat.logMetricForCount("metric", 2);
		Cat.logMetricForCount("metric", 3);

		MetricAssert.name("metric").kind(Kind.COUNT).count(6);
	}

	@Test
	public void testDuration() {
		Cat.logMetricForDuration("metric", 200);

		MetricAssert.name("metric").kind(Kind.DURATION).count(1).duration(200);
	}

	@Test
	public void testDurations() {
		Cat.logMetricForDuration("metric", 200);
		Cat.logMetricForDuration("metric", 300);
		Cat.logMetricForDuration("metric", 400);

		MetricAssert.name("metric").kind(Kind.DURATION).count(3).duration(900);
	}

	@Test
	public void testSum() {
		Cat.logMetricForSum("metric", 100);

		MetricAssert.name("metric").kind(Kind.SUM).count(1).sum(100);
	}

	@Test
	public void testSums() {
		Cat.logMetricForSum("metric", 100);
		Cat.logMetricForSum("metric", 200);
		Cat.logMetricForSum("metric", 300);

		MetricAssert.name("metric").kind(Kind.SUM).count(3).sum(600);
	}
}