This document describes the testing strategy and how to run tests for the TSFile Viewer application.
The project includes comprehensive tests for both backend and frontend:
The backend has 131 passing tests covering:
TSFile Utilities (tsfile/ package)
Service Layer (service/ package)
Controller Layer (controller/ package)
Error Handling
cd backend # Run all tests mvn test # Run specific test class mvn test -Dtest=TsFileReaderCacheTest # Run tests with coverage mvn test jacoco:report # Skip tests during build mvn clean package -DskipTests
Tests use:
@SpringBootTest @AutoConfigureMockMvc class MetadataControllerTest { @Autowired private MockMvc mockMvc; @Test void getMetadata_returnsMetadata_whenFileExists() throws Exception { mockMvc.perform(get("/api/meta/test-123")) .andExpect(status().isOk()) .andExpect(jsonPath("$.fileId").value("test-123")) .andExpect(jsonPath("$.version").exists()); } }
The frontend includes tests for:
Components (components/__tests__/)
Stores (stores/__tests__/)
API Client (api/__tests__/)
cd frontend # Install dependencies first pnpm install # Run all tests pnpm test:unit # Run tests in watch mode pnpm test:unit --watch # Run tests with coverage pnpm test:unit --coverage # Run specific test file pnpm test:unit FilterPanel.spec.ts
Tests use:
import { describe, it, expect } from 'vitest' import { mount } from '@vue/test-utils' import FilterPanel from '../FilterPanel.vue' describe('FilterPanel', () => { it('emits filter-change event when filters are updated', async () => { const wrapper = mount(FilterPanel, { props: { fileId: 'test-123' } }) await wrapper.vm.$emit('change', { startTime: 1000000, endTime: 2000000, limit: 100, offset: 0, }) expect(wrapper.emitted('change')).toBeTruthy() }) })
Integration tests verify end-to-end functionality:
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) class FileUploadIntegrationTest { @Autowired private TestRestTemplate restTemplate; @Test void uploadFile_returnsFileId() { MultiValueMap<String, Object> body = new LinkedMultiValueMap<>(); body.add("file", new FileSystemResource("test.tsfile")); ResponseEntity<UploadResponse> response = restTemplate.postForEntity( "/api/files/upload", body, UploadResponse.class ); assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); assertThat(response.getBody().getFileId()).isNotNull(); } }
Component integration tests verify interactions:
describe('Data Preview Workflow', () => { it('loads and displays data with filters', async () => { const wrapper = mount(DataPreviewView, { props: { fileId: 'test-123' } }) // Apply filters await wrapper.findComponent(FilterPanel).vm.$emit('change', { startTime: 1000000, endTime: 2000000, }) // Wait for data to load await wrapper.vm.$nextTick() // Verify data is displayed expect(wrapper.findComponent(DataTable).props('data')).toHaveLength(100) }) })
Test TSFiles are located in backend/src/test/resources/:
test-tree-model.tsfile: Sample Tree Model TSFiletest-table-model.tsfile: Sample Table Model TSFileMock data is defined in test files:
const mockData: DataRow[] = [ { timestamp: 1000000, device: 'device1', measurements: { temperature: 25.5, humidity: 60, }, }, ]
name: Tests on: [push, pull_request] jobs: backend: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - uses: actions/setup-java@v3 with: java-version: '21' - run: cd backend && mvn test frontend: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - uses: pnpm/action-setup@v2 - uses: actions/setup-node@v3 with: node-version: '22' - run: cd frontend && pnpm install && pnpm test:unit
getMetadata_returnsMetadata_whenFileExistsGenerate coverage report:
mvn test jacoco:report # Report: backend/target/site/jacoco/index.html
Generate coverage report:
pnpm test:unit --coverage # Report: frontend/coverage/index.html
Test query performance with large datasets:
@Test void queryLargeDataset_completesWithinTimeout() { long startTime = System.currentTimeMillis(); DataPreviewRequest request = new DataPreviewRequest(); request.setFileId("large-file"); request.setLimit(1000); dataService.previewData(request); long duration = System.currentTimeMillis() - startTime; assertThat(duration).isLessThan(5000); // 5 seconds }
Test rendering performance:
it('renders large dataset efficiently', async () => { const largeDataset = Array.from({ length: 10000 }, (_, i) => ({ timestamp: i * 1000, device: `device${i}`, measurements: { value: Math.random() * 100 }, })) const startTime = performance.now() const wrapper = mount(DataTable, { props: { data: largeDataset } }) const renderTime = performance.now() - startTime expect(renderTime).toBeLessThan(1000) // 1 second })
# Run tests in debug mode mvn test -Dmaven.surefire.debug # Connect debugger to port 5005
# Run tests with debugger pnpm test:unit --inspect-brk # Open chrome://inspect in Chrome
mvn clean before testingmvn dependency:treetarget/surefire-reports/rm -rf node_modules && pnpm installpnpm store prunesrc/test/java/ matching package structure.spec.ts file in __tests__/ directory next to componentWhen modifying code:
The TSFile Viewer project has comprehensive test coverage:
Run tests regularly during development to catch issues early and maintain code quality.