diff --git a/src/test/java/trackertest/TrackerTest.java b/src/test/java/trackertest/TrackerTest.java
index 104f017..8f45a4a 100644
--- a/src/test/java/trackertest/TrackerTest.java
+++ b/src/test/java/trackertest/TrackerTest.java
@@ -1,5 +1,4 @@
 package trackertest;
-
 import java.io.File;
 import java.util.Collection;
 import java.util.HashMap;
@@ -9,31 +8,26 @@
 import java.util.UUID;
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
-
 import javax.persistence.EntityManager;
 import javax.persistence.EntityManagerFactory;
 import javax.persistence.EntityTransaction;
 import javax.persistence.Persistence;
-
 import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.DynamicTest;
 import org.junit.jupiter.api.TestFactory;
-
 import entity.Seed;
 import entity.TransRecord;
 import entity.TransportId;
 import entity.config;
 import tracker.Tracker;
-
 public class TrackerTest {
     private static EntityManagerFactory emf;
     private static EntityManager em;
     private static List<String> userIds;
     private static Map<String, Long> originalUploads;
     private static Tracker tracker;
-
     @BeforeAll
     static void setup() throws Exception {
         // 强制加载 MySQL 驱动，否则无法建立连接
@@ -54,7 +48,6 @@
         userIds = em.createQuery(
             "select u.userid from UserPT u", String.class
         ).getResultList();
-
         // 保存初始 upload 值
         originalUploads = new HashMap<>();
         for (String uid : userIds) {
@@ -66,7 +59,6 @@
         }
         tracker = new Tracker(emf);
     }
-
     @AfterAll
     static void teardown() {
         // 清理：删除测试过程中保存的所有 torrent 文件
@@ -81,11 +73,9 @@
                 }
             }
         }
-
         if (em != null && em.isOpen()) em.close();
         if (emf != null && emf.isOpen()) emf.close();
     }
-
     @TestFactory
     Collection<DynamicTest> testAddUpLoad() {
         Random rnd = new Random();
@@ -99,7 +89,6 @@
                 Assertions.assertFalse(tracker.AddUpLoad(uid, delta), 
                     "AddUpLoad should return false on successful operation");
                 System.out.println("AddUpLoad assert passed for user=" + uid);
-
                 // Clear the persistence context to ensure fresh data is fetched
                 em.clear();
                 
@@ -108,7 +97,6 @@
                     "select u.upload from UserPT u where u.userid = :uid", Long.class
                 ).setParameter("uid", uid)
                  .getSingleResult();
-
                 // upload 值断言前打印
                 System.out.println("Running upload-value assert for user=" + uid);
                 Assertions.assertEquals(before + delta, after, 
@@ -123,7 +111,6 @@
             }))
             .collect(Collectors.toList());
     }
-
     @TestFactory
     Collection<DynamicTest> testReduceUpLoad() {
         Random rnd = new Random();
@@ -133,22 +120,18 @@
                 int max = (int)Math.min(before, 1000);
                 int delta = max > 0 ? rnd.nextInt(max) + 1 : 0;
                 if (delta == 0) return;  // 无可减量时跳过
-
                 // ReduceUpLoad 前打印
                 System.out.println("Running ReduceUpLoad assert for user=" + uid + ", delta=" + delta);
                 Assertions.assertFalse(tracker.ReduceUpLoad(uid, delta));
                 System.out.println("ReduceUpLoad assert passed for user=" + uid);
-
                 Long after = em.createQuery(
                     "select u.upload from UserPT u where u.userid = :uid", Long.class
                 ).setParameter("uid", uid)
                  .getSingleResult();
-
                 // 减少后值断言前打印
                 System.out.println("Running post-reduce-value assert for user=" + uid);
                 Assertions.assertEquals(before - delta, after);
                 System.out.println("Post-reduce-value assert passed for user=" + uid);
-
                 // 回滚 AddUpLoad 前打印
                 System.out.println("Running rollback AddUpLoad assert for user=" + uid + ", delta=" + delta);
                 Assertions.assertFalse(tracker.AddUpLoad(uid, delta));
@@ -156,7 +139,6 @@
             }))
             .collect(Collectors.toList());
     }
-
     @TestFactory
     Collection<DynamicTest> testAddDownload() {
         Random rnd = new Random();
@@ -167,26 +149,22 @@
                     "select u.download from UserPT u where u.userid = :uid", Long.class
                 ).setParameter("uid", uid).getSingleResult();
                 before = before != null ? before : 0L;
-
                 System.out.println("Running AddDownload assert for user=" + uid + ", delta=" + delta);
                 Assertions.assertFalse(tracker.AddDownload(uid, delta),
                     "AddDownload should return false on successful operation");
                 em.clear();
-
                 Long after = em.createQuery(
                     "select u.download from UserPT u where u.userid = :uid", Long.class
                 ).setParameter("uid", uid).getSingleResult();
                 System.out.println("Running download-value assert for user=" + uid);
                 Assertions.assertEquals(before + delta, after,
                     "Download value should be increased by " + delta);
-
                 System.out.println("Running rollback ReduceDownload assert for user=" + uid + ", delta=" + delta);
                 Assertions.assertFalse(tracker.ReduceDownload(uid, delta),
                     "Rollback ReduceDownload should return false");
             }))
             .collect(Collectors.toList());
     }
-
     @TestFactory
     Collection<DynamicTest> testReduceDownload() {
         Random rnd = new Random();
@@ -199,7 +177,6 @@
                 int max = before.intValue();
                 int delta = max > 0 ? rnd.nextInt(max) + 1 : 0;
                 if (delta == 0) return;
-
                 System.out.println("Running ReduceDownload assert for user=" + uid + ", delta=" + delta);
                 Assertions.assertFalse(tracker.ReduceDownload(uid, delta));
                 Long after = em.createQuery(
@@ -207,13 +184,11 @@
                 ).setParameter("uid", uid).getSingleResult();
                 System.out.println("Running post-reduce-download-value assert for user=" + uid);
                 Assertions.assertEquals(before - delta, after);
-
                 System.out.println("Running rollback AddDownload assert for user=" + uid + ", delta=" + delta);
                 Assertions.assertFalse(tracker.AddDownload(uid, delta));
             }))
             .collect(Collectors.toList());
     }
-
     @TestFactory
     Collection<DynamicTest> testAddMagic() {
         Random rnd = new Random();
@@ -224,23 +199,19 @@
                     "select u.magic from UserPT u where u.userid = :uid", Integer.class
                 ).setParameter("uid", uid).getSingleResult();
                 before = before != null ? before : 0;
-
                 System.out.println("Running AddMagic assert for user=" + uid + ", delta=" + delta);
                 Assertions.assertFalse(tracker.AddMagic(uid, delta));
                 em.clear();
-
                 Integer after = em.createQuery(
                     "select u.magic from UserPT u where u.userid = :uid", Integer.class
                 ).setParameter("uid", uid).getSingleResult();
                 System.out.println("Running magic-value assert for user=" + uid);
                 Assertions.assertEquals(before + delta, after.intValue());
-
                 System.out.println("Running rollback ReduceMagic assert for user=" + uid + ", delta=" + delta);
                 Assertions.assertFalse(tracker.ReduceMagic(uid, delta));
             }))
             .collect(Collectors.toList());
     }
-
     @TestFactory
     Collection<DynamicTest> testReduceMagic() {
         Random rnd = new Random();
@@ -253,7 +224,6 @@
                 int max = before.intValue();
                 int delta = max > 0 ? rnd.nextInt(max) + 1 : 0;
                 if (delta == 0) return;
-
                 System.out.println("Running ReduceMagic assert for user=" + uid + ", delta=" + delta);
                 Assertions.assertFalse(tracker.ReduceMagic(uid, delta));
                 Integer after = em.createQuery(
@@ -261,13 +231,11 @@
                 ).setParameter("uid", uid).getSingleResult();
                 System.out.println("Running post-reduce-magic-value assert for user=" + uid);
                 Assertions.assertEquals(before - delta, after.intValue());
-
                 System.out.println("Running rollback AddMagic assert for user=" + uid + ", delta=" + delta);
                 Assertions.assertFalse(tracker.AddMagic(uid, delta));
             }))
             .collect(Collectors.toList());
     }
-
     @TestFactory
     Collection<DynamicTest> testAddRecord() {
         Random rnd = new Random();
@@ -286,7 +254,6 @@
                 String downloaderId = userIds.get(rnd.nextInt(userIds.size()));
                 String seedId = seedIds.get(rnd.nextInt(seedIds.size()));
                 String taskId = UUID.randomUUID().toString();
-
                 TransRecord rd = new TransRecord();
                 rd.taskid = taskId;
                 rd.uploaduserid = uploaderId;
@@ -296,16 +263,13 @@
                 rd.download = rnd.nextInt(10000);
                 rd.maxupload = rd.upload + rnd.nextInt(10000);
                 rd.maxdownload = rd.download + rnd.nextInt(10000);
-
                 // 调用待测方法
                 int ret = tracker.AddRecord(rd);
                 Assertions.assertTrue(ret > 0, "返回值应为新记录主键");
-
                 // 验证已插入
                 TransportId pk = new TransportId(taskId, uploaderId, downloaderId);
                 TransRecord fetched = em.find(TransRecord.class, pk);
                 Assertions.assertNotNull(fetched, "应查询到新增的 TransRecord");
-
                 // 清理：删除测试记录
                 EntityTransaction tx = em.getTransaction();
                 tx.begin();
@@ -314,7 +278,6 @@
             }))
             .collect(Collectors.toList());
     }
-
     @TestFactory
     Collection<DynamicTest> testSaveTorrent() {
         List<String> seedIds = em.createQuery(
@@ -327,12 +290,10 @@
                 // 调用 SaveTorrent
                 int ret = tracker.SaveTorrent(sid, temp);
                 Assertions.assertEquals(0, ret, "SaveTorrent 应返回 0");
-
                 // 验证文件已按约定存储
                 File stored = new File(config.TORRENT_STORAGE_DIR,
                                        sid + "_" + temp.getName());
                 Assertions.assertTrue(stored.exists(), "存储文件应存在");
-
                 // 验证数据库中 url 字段已更新
                 em.clear();
                 Seed seed = em.find(Seed.class, sid);
@@ -342,14 +303,12 @@
                     new File(seed.url).getAbsolutePath(),
                     "Seed.url 应更新为存储路径"
                 );
-
                 // 清理测试文件
                 stored.delete();
                 temp.delete();
             }))
             .collect(Collectors.toList());
     }
-
     @TestFactory
     Collection<DynamicTest> testGetTTorent() {
         // 拿到所有 seedid
@@ -362,12 +321,10 @@
                 File temp = File.createTempFile(sid + "_test", ".torrent");
                 int saveRet = tracker.SaveTorrent(sid, temp);
                 Assertions.assertEquals(0, saveRet, "SaveTorrent 应返回 0");
-
                 // 刷新上下文并取回更新后的 seed 实体
                 em.clear();
                 Seed seed = em.find(Seed.class, sid);
                 Assertions.assertNotNull(seed.url, "Seed.url 应已被更新");
-
                 // 调用 GetTTorent 并断言路径一致
                 String uid = userIds.get(0), ip = "127.0.0.1";
                 File ret = tracker.GetTTorent(sid, uid, ip);
@@ -378,7 +335,6 @@
                     ret.getAbsolutePath(),
                     "返回文件路径应与Seed.url一致"
                 );
-
                 // 清理：删掉本地文件，回滚 DB url 字段，删掉 temp
                 expected.delete();
                 EntityTransaction tx = em.getTransaction();
@@ -390,4 +346,4 @@
             }))
             .collect(Collectors.toList());
     }
-}
+}
\ No newline at end of file
