diff --git a/src/test/java/trackertest/TrackerTest.java b/src/test/java/trackertest/TrackerTest.java
index 3c4898b..104f017 100644
--- a/src/test/java/trackertest/TrackerTest.java
+++ b/src/test/java/trackertest/TrackerTest.java
@@ -1,4 +1,6 @@
 package trackertest;
+
+import java.io.File;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
@@ -19,6 +21,7 @@
 import org.junit.jupiter.api.DynamicTest;
 import org.junit.jupiter.api.TestFactory;
 
+import entity.Seed;
 import entity.TransRecord;
 import entity.TransportId;
 import entity.config;
@@ -66,6 +69,19 @@
 
     @AfterAll
     static void teardown() {
+        // 清理：删除测试过程中保存的所有 torrent 文件
+        File storageDir = new File(config.TORRENT_STORAGE_DIR);
+        if (storageDir.exists() && storageDir.isDirectory()) {
+            File[] files = storageDir.listFiles();
+            if (files != null) {
+                for (File f : files) {
+                    if (f.isFile()) {
+                        f.delete();
+                    }
+                }
+            }
+        }
+
         if (em != null && em.isOpen()) em.close();
         if (emf != null && emf.isOpen()) emf.close();
     }
@@ -298,4 +314,80 @@
             }))
             .collect(Collectors.toList());
     }
+
+    @TestFactory
+    Collection<DynamicTest> testSaveTorrent() {
+        List<String> seedIds = em.createQuery(
+            "select s.seedid from Seed s", String.class
+        ).getResultList();
+        return seedIds.stream()
+            .map(sid -> DynamicTest.dynamicTest("SaveTorrent for seed " + sid, () -> {
+                // 准备一个临时空文件
+                File temp = File.createTempFile(sid + "_test", ".torrent");
+                // 调用 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);
+                // 将 seed.url 转为 File 再取绝对路径进行比较
+                Assertions.assertEquals(
+                    stored.getAbsolutePath(),
+                    new File(seed.url).getAbsolutePath(),
+                    "Seed.url 应更新为存储路径"
+                );
+
+                // 清理测试文件
+                stored.delete();
+                temp.delete();
+            }))
+            .collect(Collectors.toList());
+    }
+
+    @TestFactory
+    Collection<DynamicTest> testGetTTorent() {
+        // 拿到所有 seedid
+        List<String> seedIds = em.createQuery(
+            "select s.seedid from Seed s", String.class
+        ).getResultList();
+        return seedIds.stream()
+            .map(sid -> DynamicTest.dynamicTest("GetTTorent for seed " + sid, () -> {
+                // 准备一个临时空文件并 SaveTorrent
+                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);
+                File expected = new File(seed.url);
+                Assertions.assertNotNull(ret, "应返回文件对象");
+                Assertions.assertEquals(
+                    expected.getAbsolutePath(),
+                    ret.getAbsolutePath(),
+                    "返回文件路径应与Seed.url一致"
+                );
+
+                // 清理：删掉本地文件，回滚 DB url 字段，删掉 temp
+                expected.delete();
+                EntityTransaction tx = em.getTransaction();
+                tx.begin();
+                seed.url = null;
+                em.merge(seed);
+                tx.commit();
+                temp.delete();
+            }))
+            .collect(Collectors.toList());
+    }
 }
