Back to Repositories

Testing Bloom Filter Implementations in JCSprout

This test suite evaluates the implementation and performance of Bloom Filters using multiple approaches including Guava’s BloomFilter, HashSet, and a custom BloomFilters implementation. The suite focuses on comparing different data structure implementations for membership testing with large datasets.

Test Coverage Overview

The test suite provides comprehensive coverage of Bloom Filter functionality across different implementations:
  • Tests Guava’s BloomFilter implementation with 10M elements
  • Evaluates HashSet performance as a comparison baseline
  • Validates custom BloomFilters implementation
  • Covers positive and negative membership tests
  • Includes performance timing measurements

Implementation Analysis

The testing approach employs three distinct methods to validate Bloom Filter behavior:
  • Utilizes Guava’s built-in BloomFilter with integer funnel and 1% false positive rate
  • Implements comparative testing using Java’s HashSet collection
  • Tests custom BloomFilters class with string-based input
  • Each test method includes performance timing and assertion-based verification

Technical Details

Testing infrastructure and configuration:
  • JUnit testing framework
  • Guava library for BloomFilter implementation
  • Custom BloomFilters class integration
  • Test dataset size: 10 million elements
  • Performance measurement using System.currentTimeMillis()

Best Practices Demonstrated

The test suite exemplifies several testing best practices:
  • Comparative performance testing between different implementations
  • Consistent test structure across multiple implementations
  • Clear separation of test cases
  • Both positive and negative assertion testing
  • Performance measurement integration

crossoverjie/jcsprout

src/test/java/com/crossoverjie/algorithm/BloomFiltersTest.java

            
package com.crossoverjie.algorithm;

import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;
import org.junit.Assert;
import org.junit.Test;

import java.util.HashSet;
import java.util.Set;

public class BloomFiltersTest {

    private static int count = 10000000;

    @Test
    public void guavaTest() {
        long star = System.currentTimeMillis();
        BloomFilter<Integer> filter = BloomFilter.create(
                Funnels.integerFunnel(),
                count,
                0.01);

        for (int i = 0; i < count; i++) {
            filter.put(i);
        }

        Assert.assertTrue(filter.mightContain(1));
        Assert.assertTrue(filter.mightContain(2));
        Assert.assertTrue(filter.mightContain(3));
        Assert.assertFalse(filter.mightContain(count));
        long end = System.currentTimeMillis();
        System.out.println("执行时间:" + (end - star));
    }


    @Test
    public void hashMapTest(){
        long star = System.currentTimeMillis();

        Set<Integer> hashset = new HashSet<>(10000000) ;
        for (int i = 0; i < 10000000; i++) {
            hashset.add(i) ;
        }
        Assert.assertTrue(hashset.contains(1));
        Assert.assertTrue(hashset.contains(2));
        Assert.assertTrue(hashset.contains(3));

        long end = System.currentTimeMillis();
        System.out.println("执行时间:" + (end - star));
    }

    @Test
    public void bloomFilterTest(){
        long star = System.currentTimeMillis();
        BloomFilters bloomFilters = new BloomFilters(count) ;
        for (int i = 0; i < count; i++) {
            bloomFilters.add(i + "") ;
        }
        Assert.assertTrue(bloomFilters.check(1+""));
        Assert.assertTrue(bloomFilters.check(2+""));
        Assert.assertTrue(bloomFilters.check(3+""));
        Assert.assertTrue(bloomFilters.check(999999+""));
        Assert.assertFalse(bloomFilters.check(400230340+""));
        long end = System.currentTimeMillis();
        System.out.println("执行时间:" + (end - star));
    }
}