專利名稱:快速測試機頂盒的方法和系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明數(shù)字電視開發(fā)及測試領(lǐng)域,尤其是涉及一種快速測試機頂盒的方法和系統(tǒng)。
背景技術(shù):
近年來,中國數(shù)字電視產(chǎn)業(yè)獲得了新發(fā)展,用戶數(shù)量進一步擴大,使數(shù)字機頂盒產(chǎn) 業(yè)規(guī)?;蔀榭赡埽瑪?shù)字機頂盒的市場潛力巨大。各大廠商紛紛切入數(shù)字機頂盒市場,同時 產(chǎn)業(yè)的競爭也日益激烈,對開發(fā)及測試效率和產(chǎn)品質(zhì)量的要求也愈加強烈。目前,針對機頂盒功能和性能的測試,沒有一個科學及系統(tǒng)的測試方法,以至于不 能及時發(fā)現(xiàn)產(chǎn)品的Bug(錯誤)或者發(fā)現(xiàn)Bug不能得到及時的處理和解決。具體而言,傳統(tǒng) 的對機頂盒功能和性能的方法,還是基于手工作業(yè)及簡單模塊化測試,基本上是用一個輸 出端口發(fā)送數(shù)據(jù)并測試其返回的信息。很顯然,這種傳統(tǒng)的測試方法存在它的局限性第一,傳統(tǒng)的測試方法已經(jīng)不能滿足目前大批量和快速響應的需求;第二,傳統(tǒng)的測試方法在實際測試中效率和質(zhì)量受到客戶的嚴重質(zhì)疑和挑戰(zhàn)。因此,數(shù)字電視產(chǎn)業(yè)的加速發(fā)展,對數(shù)字機頂盒的質(zhì)量和的快速的供應需求提出 了要求。一種快速檢測和及時有效定位Bug的測試方法,成為測試領(lǐng)域攻堅的難題,也自然 成為產(chǎn)業(yè)發(fā)展必須克服和解決的問題。
發(fā)明內(nèi)容
本發(fā)明的目的是提出一種快速測試機頂盒的方法和系統(tǒng),以解決現(xiàn)有技術(shù)存在的 上述問題。本發(fā)明為解決上述技術(shù)問題而采用的技術(shù)方案是提出一種快速測試機頂盒的系 統(tǒng),包括服務器控制端和信息控制端。服務器控制端包括指令單元,用以根據(jù)測試步驟發(fā) 出第一測試指令;測試腳本單元,連接該指令單元,用以響應指令單元的第一測試指令,調(diào) 用測試腳本,根據(jù)測試腳本所記錄的步驟向機頂盒發(fā)送第二測試指令;監(jiān)控單元,連接該指 令單元,用以監(jiān)控第一測試指令和測試腳本的執(zhí)行情況,并向指令單元報告異常。信息控制 端上布置待測試的機頂盒,該機頂盒通過端口連接該服務器控制端的測試腳本單元和監(jiān)控 單元。該信息控制端包括信息收集單元,連接該機頂盒,用以收集該機頂盒返回的測試數(shù) 據(jù);信息處理單元,連接該信息收集單元,用以處理該機頂盒返回的測試數(shù)據(jù),當發(fā)現(xiàn)測試 異常時,該信息處理單元記錄與測試異常對應的測試步驟和測試腳本;信息反饋單元,連接 該信息處理單元,用以記錄測試數(shù)據(jù)。在本發(fā)明的一實施例中,該信息反饋單元在出現(xiàn)測試異常時,將測試異常數(shù)據(jù)反 饋給服務器控制端的監(jiān)控單元。在本發(fā)明的一實施例中,該指令單元根據(jù)該監(jiān)控單元所報告的異常,以一設(shè)定循 環(huán)次數(shù),循環(huán)執(zhí)行對應的測試步驟和測試腳本。在本發(fā)明的一實施例中,該監(jiān)控單元還用于依據(jù)來自該機頂盒的測試數(shù)據(jù)判斷異常。在本發(fā)明的一實施例中,該信息處理單元還用于記錄循環(huán)執(zhí)行對應的測試步驟和 測試腳本時,測試異常的復現(xiàn)率。本發(fā)明提出一種快速測試機頂盒的方法,利用上述的測試系統(tǒng)來測試機頂盒,該 方法包括如下步驟建立服務器端和信息控制端的連接;由指令單元根據(jù)測試步驟向測試 腳本單元發(fā)出第一測試指令;由測試腳本單元調(diào)用和執(zhí)行測試腳本,以根據(jù)測試腳本所記 錄的步驟向機頂盒發(fā)送第二測試指令;開啟監(jiān)控單元,以監(jiān)控第一測試指令和測試腳本的 執(zhí)行情況;在信息收集單元收集機頂盒返回的測試數(shù)據(jù);在信息處理單元根據(jù)測試數(shù)據(jù)搜 索測試異常,當出現(xiàn)測試異常時,信息處理單元記錄測試異常對應的測試步驟和測試腳本; 當未出現(xiàn)測試異常時,流程結(jié)束;在信息反饋單元記錄測試數(shù)據(jù),并在出現(xiàn)測試異常時,將 測試異常數(shù)據(jù)反饋給服務器控制端的監(jiān)控單元;在監(jiān)控單元向指令單元報告測試異常及其 對應的測試步驟和測試腳本;在指令單元設(shè)定循環(huán)測試次數(shù),且重新執(zhí)行出現(xiàn)測試異常的 測試步驟和對應的測試腳本,進行持續(xù)性和循環(huán)性能測試;以及在信息反饋單元監(jiān)控和統(tǒng) 計重復出現(xiàn)的測試異常。在本發(fā)明的一實施例中,所述指令單元列出所有測試項目以及測試方式和測試流 程,按每一步驟執(zhí)行第一測試指令。在本發(fā)明的一實施例中,在重新執(zhí)行出現(xiàn)測試異常的測試步驟和對應的測試腳本 之前還包括初始化。在本發(fā)明的一實施例中,該機頂盒返回的數(shù)據(jù)包括日志。在本發(fā)明的一實施例中,在信息處理單元根據(jù)測試數(shù)據(jù)搜索測試異常包括,在測 試數(shù)據(jù)中搜索是否存在與測試異常有關(guān)的關(guān)鍵字。與傳統(tǒng)測試技術(shù)相比,本發(fā)明的方法和系統(tǒng)有效的提升了測試效率,實現(xiàn)了開發(fā) 測試過程中快速響應的要求,其具體表現(xiàn)在以下幾個方面1、系統(tǒng)的測試方法大大縮短了測試時間;2、自動化的測試工具去除了繁瑣的手工測試及有效的控制了人力資源成本;3、能夠快速檢測過程中的Bug并精確定位;4、針對過程中出現(xiàn)的Bug實現(xiàn)了科學的統(tǒng)計和管理;5、測試統(tǒng)計數(shù)據(jù)為程序更新和軟件版本提供準確依據(jù)。
為讓本發(fā)明的上述目的、特征和優(yōu)點能更明顯易懂,以下結(jié)合附圖對本發(fā)明的具 體實施方式作詳細說明,其中圖1是本發(fā)明一實施例的測試系統(tǒng)結(jié)構(gòu)圖。圖2和圖3是本發(fā)明一實施例的測試方法流程圖。
具體實施例方式概要地說,本發(fā)明下面要描述的實施例以服務器端和信息控制端兩大系統(tǒng)為基 礎(chǔ),集成所需功能和性能測試模塊,進行自動化程序測試管理,同時創(chuàng)建監(jiān)控系統(tǒng)和Bug反 饋流程,準確定位出現(xiàn)Bug并及時處理和解決,對所發(fā)生的Bug進行統(tǒng)計列表,得出Bug故障率和復現(xiàn)情況并及時加入案例管理系統(tǒng)。圖1是本發(fā)明一實施例的測試系統(tǒng)結(jié)構(gòu)圖。首先,請參閱圖1,測試系統(tǒng)包括服務 器控制端100和信息控制端200。服務器控制端200是由服務器和程序控制組成,其內(nèi)部 配置指令單元110、測試腳本單元120和監(jiān)控單元130。信息控制端200上連接有被測單元 10,即機頂盒。信息控制端200還配置有信息收集單元210、信息處理單元220和信息反饋 單元230。在組建系統(tǒng)時,首先建立服務器控制端100和信息控制端200之間的連接。服務 器控制端100提供測試硬件和測試端口,通過串口線或網(wǎng)線連接測試端口(COM/LAN)和機 頂盒10,具體測試端口可視機頂盒實際配置。然后,設(shè)置測試端口接收和發(fā)送參數(shù),開啟服 務器和機頂盒。在一實施例中,服務器控制端100和信息控制端200的連接為服務器控制端100 與機頂盒10的數(shù)據(jù)交換。服務器控制端100以通信控制指令和信息控制端200的信息反 饋單元進行信息交換。指令單元110用于產(chǎn)生測試指令并輸出給測試腳本單元120。指令單元110可列 出所有測試項目以及測試方式和測試流程,按每一步驟(Vector)執(zhí)行測試,來發(fā)出測試指 令給機頂盒10。在一實施例中,指令單元110可利用指令控制程序“testplan”來列出測試 項目以及測試方式和測試流程。根據(jù)所發(fā)出指令單元110的測試指令,測試腳本單元120調(diào)用測試腳本并根據(jù)腳 本所記錄的步驟逐一發(fā)出多個測試指令,這些測試指令用于對機頂盒進行測試。測試可模 擬機頂盒在客戶端進行的所有按鍵操作,編寫機頂盒輸入指令,按照測試要求劃分測試模 塊并儲存。在本發(fā)明的上下文中,為了區(qū)分的方便,將由指令單元110發(fā)出的測試指令稱為 “第一測試指令”,將由測試腳本單元120所發(fā)出的測試指令稱為“第二測試指令”。監(jiān)控單元130監(jiān)控第一測試指令和測試腳本的執(zhí)行情況并記錄,例如監(jiān)控單元 130監(jiān)控第一測試指令和測試腳本是否被正確執(zhí)行。指令單元110每發(fā)出一條第一測試指 令,測試腳本單元120每執(zhí)行一條腳本,都必須由監(jiān)控單元130判斷是否符合測試條件,如 果符合測試條件,再由服務器控制端發(fā)送給機頂盒,運行測試。在一實施例中,每一第一測試指令可與固定的測試腳本相關(guān)聯(lián),因此,當執(zhí)行單元 130執(zhí)行了一特定的第一指令,測試腳本單元120就可執(zhí)行關(guān)聯(lián)的測試腳本。機頂盒10會按照測試步驟逐一接受第二測試指令,對每一測試步驟提供測試響 應,并返回測試數(shù)據(jù),例如日志。一方面,測試數(shù)據(jù)由通信端口返回服務器控制端100。另一 方面,機頂盒的測試數(shù)據(jù)在信息控制端200內(nèi)接受處理。針對機頂盒10返回的測試完成后數(shù)據(jù),例如日志,監(jiān)控單元130可以進行初步的 處理,例如搜索部分關(guān)鍵字,并判斷是否有Bug,并將結(jié)果返回至指令單元110。在信息控制端200,測試數(shù)據(jù)由信息收集單元210指定數(shù)據(jù)保存路徑并保存。信息 處理單元220根據(jù)訪問路徑進行信息訪問,針對測試數(shù)據(jù)中具體特定關(guān)鍵字進行搜索,并 根據(jù)關(guān)鍵字搜索情況判斷是否為Bug。信息反饋單元220可將有Bug測試列出,并將其歸類到相應的測試步驟、執(zhí)行腳 本。例如,根據(jù)不同測試腳本執(zhí)行的不同關(guān)鍵字進行判斷,判斷是否符合功能測試要求(如 VOD點播過程出現(xiàn)Error信息為非法信息,判斷為Bug),如判斷為Bug,就列出Bug測試數(shù)據(jù)并調(diào)出與之相應的測試步驟和測試腳本,作為測試異常數(shù)據(jù)。信息反饋單元230可將異常 數(shù)據(jù)保存并返回服務器控制端210的監(jiān)控單元130。監(jiān)控單元130可根據(jù)信息反饋單元返回的異常數(shù)據(jù),調(diào)用相應的測試操作步驟, 并提交給指令單元110執(zhí)行。在一實施例中,監(jiān)控單元130根據(jù)機頂盒正常時返回的信息數(shù)據(jù)作為參照,對測 試后機頂盒返回信息數(shù)據(jù)進行逐行掃描,如發(fā)現(xiàn)非法字段或數(shù)字即為Bug,將有Bug的測試 數(shù)據(jù)保存并返回給服務器指令單元。指令單元110會根據(jù)反饋要求重新調(diào)用循環(huán)測試程序,對有Bug的模塊進行持續(xù) 循環(huán)測試,重新調(diào)用異常數(shù)據(jù)中記錄的導致異常的測試步驟和測試腳本,并設(shè)定循環(huán)程序 和腳本執(zhí)行次數(shù)。同時,由于性能測試通常是基于多次測試的結(jié)果,因此在此過程中,可以 一并進行其他性能相關(guān)測試,由指令單元110執(zhí)行和調(diào)用相應腳本。重新執(zhí)行的程序為單獨數(shù)據(jù)保存,測試后,信息控制端200的各單元僅記錄測試 數(shù)據(jù),而不返回服務器控制端100。對測試數(shù)據(jù),由信息處理單元210檢索和判斷是否依然 為Bug,以此類推。當循環(huán)測試指令單元設(shè)定次數(shù)后,信息處理單元210統(tǒng)計測試結(jié)果,計算 此類現(xiàn)象出現(xiàn)的頻率和復現(xiàn)的次數(shù),為機頂盒程序修改和軟件升級提供開發(fā)依據(jù)。圖2和圖3是本發(fā)明一實施例的測試方法流程圖。參照圖2和圖3所示,流程包 括以下步驟在預備的步驟S01,S02,先建立整體指令測試程序,并且建立單元測試腳本。在步驟S03,連接各測試單元,連接服務器控制端100和信息控制端200。流程開始時,步驟S 10,進行初始化。初始化還可以完成所有功能測試腳本后對有Bug (例如步驟S12、S14導致的Bug) 的測試和性能測試初始化,將有Bug測試的腳本重新歸類到性能測試中進行重復測試,并 將測試步驟一并到性能測試中進行循環(huán)測試。步驟S11,發(fā)出第一測試指令。具體地說,啟動指令單元110,發(fā)出第一測試指令。 啟動監(jiān)控單元130,對指令執(zhí)行情況和后續(xù)的腳本調(diào)用步驟進行監(jiān)控。步驟S12,監(jiān)控單元130監(jiān)控第一指令是否執(zhí)行,若是,流程進入步驟S13,否則,流 程返回步驟SOl。步驟S13,測試腳本單元120執(zhí)行測試腳本。具體地說,測試腳本單元120調(diào)用測 試腳本并執(zhí)行。 步驟S14,監(jiān)控單元130監(jiān)控腳本是否執(zhí)行,若是,流程進入步驟S15,否則,流程返 回步驟SOl。每執(zhí)行完一個腳本,測試腳本單元120記錄并反饋測試數(shù)據(jù),針對測試Bug的腳 本,記錄執(zhí)行步驟及測試響應指令,測試數(shù)據(jù)由監(jiān)控單元130返回指令單元110。在執(zhí)行腳本的過程中,被測單元,即機頂盒接受測試指令。機頂盒按照測試步驟逐 一接受測試指令,對每一測試步驟提供測試響應,并打印日志,由通信端口返回服務器控制 端100,再在信息控制端200接受處理。在步驟S15,進行機頂盒測試后信息數(shù)據(jù)收集。機頂盒按測試步驟逐一測試腳本, 測試后機頂盒通信端口返回測試數(shù)據(jù),由信息收集單元210指定數(shù)據(jù)保存路徑并保存。在步驟S16,如果信息順利收集,流程進入步驟S17。如果信息無法收集,流程返回步驟S03。步驟S17,信息處理。機頂盒返回測試數(shù)據(jù)后,由信息收集單元210保存并指定路 徑,信息處理單元220根據(jù)訪問路徑進行信息訪問,針對測試日志中具體特定關(guān)鍵字進行 搜索,并根據(jù)關(guān)鍵字搜索情況判斷是否為Bug。在步驟S18,根據(jù)測試是否異常,決定結(jié)束流程或者進入步驟S19。步驟S19,如果這種異常是首次出現(xiàn),進入步驟S21,進行測試信息反饋。信息反饋 單元210根據(jù)經(jīng)步驟S17判斷后的測試數(shù)據(jù),將Bug進行歸類,調(diào)用相應的測試步驟和執(zhí)行 腳本并記錄,然后作為測試異常數(shù)據(jù)返回服務器控制端100。步驟S22,監(jiān)控單元130得到異常的測試數(shù)據(jù)后,將從中找出非法字段,并調(diào)用對 應的測試步驟和測試腳本,以提交給指令單元110執(zhí)行。步驟S23,指令單元110根據(jù)監(jiān)控單元130的要求重新調(diào)用循環(huán)測試程序,對有 Bug的模塊進行持續(xù)循環(huán)測試,重新調(diào)用之前記錄的導致錯誤的測試步驟和測試腳本。指令 單元110需設(shè)定循環(huán)程序和腳本執(zhí)行次數(shù)。同時,可以一并進行性能測試,執(zhí)行和調(diào)用相應 腳本測試。在步驟S24,當測試次數(shù)未到達循環(huán)次數(shù),流程回到步驟S11,重新開始執(zhí)行。否 則,流程于步驟S30結(jié)束。另外,流程監(jiān)控循環(huán)測試復現(xiàn)率。如果在步驟S 19發(fā)現(xiàn)異常時在循環(huán)測試后復 現(xiàn),則進入步驟S20,導出復現(xiàn)問題并統(tǒng)計保存。重新執(zhí)行的程序為單獨數(shù)據(jù)保存,測試后僅 記錄測試數(shù)據(jù)不反饋服務器控制端。流程由步驟S20進入步驟S23。當循環(huán)次數(shù)達到后,統(tǒng) 計測試結(jié)果,計算此類現(xiàn)象出現(xiàn)的頻率和復現(xiàn)的次數(shù),為機頂盒程序修改和軟件升級提供 開發(fā)依據(jù)。統(tǒng)計復現(xiàn)率的意義在于,在檢測機頂盒功能和性能測試中,會產(chǎn)生一些誤測,可能 不是因為機頂盒本身質(zhì)量產(chǎn)生的,而是由外界原因產(chǎn)生。比如說數(shù)字電視信號的強弱,環(huán)境 磁場短時間的干擾,電源供電的不穩(wěn)定性等等,這些現(xiàn)象都會影響測試結(jié)果。所以通過持 續(xù)的多次的循環(huán)測試,計算復現(xiàn)的次數(shù),可以準確的判斷Bug的根本原因,及時快速的定位 Bug,減少了人工排除時間,提升了測試效率。在檢測機頂盒功能和性能測試中,長時間的或者批量測試會占用大量的人力資源 和時間,由本發(fā)明測試方法的統(tǒng)計保存可以在無人值守情況下測試,測試人員只要通過訪 問測試日志即可對整個測試情況及Bug發(fā)生的流程直接掌控。雖然本發(fā)明已以較佳實施例揭示如上,然其并非用以限定本發(fā)明,任何本領(lǐng)域技 術(shù)人員,在不脫離本發(fā)明的精神和范圍內(nèi),當可作些許的修改和完善,因此本發(fā)明的保護范 圍當以權(quán)利要求書所界定的為準。
權(quán)利要求
1.一種快速測試機頂盒的系統(tǒng),包括 服務器控制端,包括指令單元,用以根據(jù)測試步驟發(fā)出第一測試指令;測試腳本單元,連接該指令單元,用以響應指令單元的第一測試指令,調(diào)用測試腳本, 根據(jù)測試腳本所記錄的步驟向機頂盒發(fā)送第二測試指令;監(jiān)控單元,連接該指令單元,用以監(jiān)控第一測試指令和測試腳本的執(zhí)行情況,并向指令 單元報告異常;信息控制端,其上布置待測試的機頂盒,該機頂盒通過端口連接該服務器控制端的測 試腳本單元和監(jiān)控單元,該信息控制端包括信息收集單元,連接該機頂盒,用以收集該機頂盒返回的測試數(shù)據(jù); 信息處理單元,連接該信息收集單元,用以處理該機頂盒返回的測試數(shù)據(jù),當發(fā)現(xiàn)測試 異常時,該信息處理單元記錄與測試異常對應的測試步驟和測試腳本; 信息反饋單元,連接該信息處理單元,用以記錄測試數(shù)據(jù)。
2.如權(quán)利要求1所述的系統(tǒng),其特征在于,該信息反饋單元在出現(xiàn)測試異常時,將測試 異常數(shù)據(jù)反饋給服務器控制端的監(jiān)控單元。
3.如權(quán)利要求1或2所述的系統(tǒng),其特征在于,該指令單元根據(jù)該監(jiān)控單元所報告的異 常,以一設(shè)定循環(huán)次數(shù),循環(huán)執(zhí)行對應的測試步驟和測試腳本。
4.如權(quán)利要求1所述的系統(tǒng),其特征在于,該監(jiān)控單元還用于依據(jù)來自該機頂盒的測 試數(shù)據(jù)判斷異常。
5.如權(quán)利要求3所述的系統(tǒng),其特征在于,該信息處理單元還用于記錄循環(huán)執(zhí)行對應 的測試步驟和測試腳本時,測試異常的復現(xiàn)率。
6.一種快速測試機頂盒的方法,利用如權(quán)利要求1所述的系統(tǒng)來測試機頂盒,該方法 包括如下步驟建立服務器端和信息控制端的連接;由指令單元根據(jù)測試步驟向測試腳本單元發(fā)出第一測試指令; 由測試腳本單元調(diào)用和執(zhí)行測試腳本,以根據(jù)測試腳本所記錄的步驟向機頂盒發(fā)送第 二測試指令;開啟監(jiān)控單元,以監(jiān)控第一測試指令和測試腳本的執(zhí)行情況; 在信息收集單元收集機頂盒返回的測試數(shù)據(jù);在信息處理單元根據(jù)測試數(shù)據(jù)搜索測試異常,當出現(xiàn)測試異常時,信息處理單元記錄 測試異常對應的測試步驟和測試腳本;當未出現(xiàn)測試異常時,流程結(jié)束;在信息反饋單元記錄測試數(shù)據(jù),并在出現(xiàn)測試異常時,將測試異常數(shù)據(jù)反饋給服務器 控制端的監(jiān)控單元;在監(jiān)控單元向指令單元報告測試異常及其對應的測試步驟和測試腳本; 在指令單元設(shè)定循環(huán)測試次數(shù),且重新執(zhí)行出現(xiàn)測試異常的測試步驟和對應的測試腳 本,進行持續(xù)性和循環(huán)性能測試;以及在信息反饋單元監(jiān)控和統(tǒng)計重復出現(xiàn)的測試異常。
7.如權(quán)利要求6所述的方法,其特征在于,所述指令單元列出所有測試項目以及測試 方式和測試流程,按每一步驟執(zhí)行第一測試指令。
8.如權(quán)利要求6所述的方法,其特征在于,在重新執(zhí)行出現(xiàn)測試異常的測試步驟和對 應的測試腳本之前還包括初始化。
9.如權(quán)利要求6所述的方法,其特征在于,該機頂盒返回的數(shù)據(jù)包括日志。
10.如權(quán)利要求6所述的方法,其特征在于,在信息處理單元根據(jù)測試數(shù)據(jù)搜索測試異 常包括,在測試數(shù)據(jù)中搜索是否存在與測試異常有關(guān)的關(guān)鍵字。
全文摘要
本發(fā)明涉及一種快速測試機頂盒的方法和系統(tǒng),系統(tǒng)包括服務器控制端和信息控制端。服務器控制端包括指令單元,用以根據(jù)測試步驟發(fā)出第一測試指令;測試腳本單元,用以響應指令單元的第一測試指令,調(diào)用測試腳本,根據(jù)測試腳本所記錄的步驟向機頂盒發(fā)送第二測試指令;監(jiān)控單元用以監(jiān)控第一測試指令和測試腳本的執(zhí)行情況,并向指令單元報告異常。信息控制端上布置待測試的機頂盒,該機頂盒通過端口連接服務器控制端。信息控制端包括信息收集單元,用以收集機頂盒返回的測試數(shù)據(jù);信息處理單元,用以處理該機頂盒返回的測試數(shù)據(jù),當發(fā)現(xiàn)測試異常時,該信息處理單元記錄與測試異常對應的測試步驟和測試腳本;信息反饋單元,用以記錄測試數(shù)據(jù)。
文檔編號H04N17/04GK102075789SQ20101061850
公開日2011年5月25日 申請日期2010年12月31日 優(yōu)先權(quán)日2010年12月31日
發(fā)明者孫宏明 申請人:上海全景數(shù)字技術(shù)有限公司