【Web自動化測試——代碼篇十二】自動化測試模型——數據驅動測試和關鍵字驅動測試

?🔥 交流討論:歡迎加入我們一起學習!

🔥 資源分享耗時200+小時精選的「軟件測試」資料包

🔥?教程推薦:火遍全網的《軟件測試》教程??

📢歡迎點贊 👍 收藏 ?留言 📝 如有錯誤敬請指正!

自動化測試模型可以看作自動化測試框架與工具設計的思想。隨著自動化測試技術的發展,演化為以下幾種模型:

  • 線性測試
  • 模塊化驅動側式
  • 數據驅動測試
  • 關鍵字驅動測試

數據驅動測試

前一篇所講的模塊化驅動測試能夠很好的解決腳本重復的問題,但是在針對同一個功能進行不同數據的測試,從而檢測測試結果的變化時仍然需要重復地編寫測試腳本。于是,數據驅動測試的概念就為解決這類問題而被提出。
我們可以通過讀取定義的數組、字典,或者是外部文件(excel、csv、txt、xml等),都可以看作是數據驅動,從而實現數據與腳本的分離,進一步增強腳本的復用性。

圖片.png

讀取txt文件

圖片.png

Java

(ノへ ̄、)這段代碼存在一個問題,txt文件中有四組數據,但運行時只執行了三組數據(運行時忽略了一條密碼為空的數據)。

復制代碼

data.javapackage PublicMethods;import java.io.*;
import java.util.*;public class data {//讀取txt文件public static Map txtData(String fileName) throws IOException {Map<String, String> map = new HashMap<String , String>(); //存放多個鍵值對String[] arryTemp = null;String username = null;String password = null;String s = null;File file = new File(fileName);FileReader fr = new FileReader(file);BufferedReader br = new BufferedReader(fr);while((s = br.readLine()) != null){arryTemp = s.split(","); //將一行數據存入數組username = arryTemp[0];  //獲取賬戶password = arryTemp[1];  //獲取密碼map.put(username, password); //存儲一組賬號密碼}return map;}
}

復制代碼

復制代碼

share.javapackage PublicMethods;import org.openqa.selenium.By;
import org.openqa.selenium.NoAlertPresentException;
import org.openqa.selenium.WebDriver;
import java.util.Map;
import java.util.Set;
import org.openqa.selenium.firefox.FirefoxDriver;public class share {private static WebDriver driver;public static WebDriver OpenDriver(String url){driver = new FirefoxDriver();driver.get(url);return driver;}public static void UserLogin(WebDriver driver, Map map) throws InterruptedException {Set<String> keyset = map.keySet(); //獲取Map的值for(String count : keyset) {Thread.sleep(2000);driver.findElement(By.xpath("//*[@id='username']")).sendKeys(count);System.out.println(count);driver.findElement(By.xpath("//*[@id='password']")).sendKeys(map.get(count).toString());Thread.sleep(2000);driver.findElement(By.xpath("//*[@id='login_button']")).click();Thread.sleep(2000);try{driver.switchTo().alert().accept();Thread.sleep(2000);driver.findElement(By.xpath("//*[@id='username']")).clear();driver.findElement(By.xpath("//*[@id='password']")).clear();}catch(NoAlertPresentException NofindAlert){UserLogout(driver);}    }}public static void UserLogout(WebDriver driver) throws InterruptedException{driver.findElement(By.xpath("//*[@id='logout_button']")).click();Thread.sleep(2000);}
}

復制代碼

復制代碼

LoginTest.javapackage Test;import java.io.IOException;
import java.util.*;
import PublicMethods.*;import org.openqa.selenium.WebDriver;public class LoginTest {public static void main(String[] args) throws InterruptedException, IOException {// TODO Auto-generated method stubWebDriver driver = PublicMethods.share.OpenDriver("file:///D:/%E7%99%BB%E5%BD%95.html");String filename = "D:\\app_tool\\eclipse-workspace\\AutoTest\\TestData\\user_info.txt";Map map = txtData(filename);UserLogin(driver, map);driver.quit();}
}

復制代碼

Python

復制代碼

data.pyclass data():# 讀取txt文件def txtData(self, fileName):file = open(fileName, 'r')lines = file.readlines()file.close()return lines

復制代碼

復制代碼

share.pyfrom time import *
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as ECclass share():# 啟動瀏覽器def open_driver(self, url):driver = webdriver.Firefox()driver.implicitly_wait(10)driver.get(url)return driver# 登錄賬號檢測def user_login(self, driver, lines):for line in lines:sleep(2)driver.find_element(By.XPATH, "//*[@id='username']").send_keys(line.split(',')[0])driver.find_element(By.XPATH, "//*[@id='password']").send_keys(line.split(',')[1])sleep(2)driver.find_element(By.XPATH, "//*[@id='login_button']").click()sleep(2)result =EC.alert_is_present()(driver)# 判斷是否有彈窗if result:result.accept()driver.find_element(By.XPATH, "//*[@id='username']").clear()driver.find_element(By.XPATH, "//*[@id='password']").clear()# 退出賬號def user_logout(self, driver):driver.find_element(By.XPATH, "//*[@id='logout_button']").click()sleep(2)

復制代碼

復制代碼

LoginTest.pyfrom public import share,datadriver = share.share().open_driver('file:///D:/%E7%99%BB%E5%BD%95.html')filename = 'user_info.txt'
lines = data.data().txtData(filename)share.share().user_login(driver, lines)
share.share().user_logout(driver)
driver.quit()

復制代碼

Ruby

讀取csv文件

該方法同樣適用于讀取txt文件

Java

復制代碼

data.javapackage PublicMethods;import java.io.*;
import java.util.*;public class data {//讀取csv文件public static ArrayList<String[]> csvData(String fileName){ArrayList<String[]> list = new ArrayList<String[]>();  //創建保存數據集合CsvReader cReader = null;try{cReader = new CsvReader(fileName);//是否跳過表頭cReader.readHeaders();while(cReader.readRecord()){list.add(cReader.getValues());}}catch(Exception e) {e.printStackTrace();}finally{cReader.close();}//如果使用testng的DataProvider,可以返回一個二維數組Object data[][] = new Object[list.size()][];for(int i=0;i<list.size();i++){data[i]=list.get(i);}return list;}
}

復制代碼

復制代碼

share.javapackage PublicMethods;import org.openqa.selenium.By;
import org.openqa.selenium.NoAlertPresentException;
import org.openqa.selenium.WebDriver;
import java.util.ArrayList;
import org.openqa.selenium.firefox.FirefoxDriver;public class share {private static WebDriver driver;public static WebDriver OpenDriver(String url){driver = new FirefoxDriver();driver.get(url);return driver;}public static void UserLogin(WebDriver driver, ArrayList<String[]> list) throws InterruptedException {for(int i=0;i<list.size();i++) {Thread.sleep(2000);driver.findElement(By.xpath("//*[@id='username']")).sendKeys(list.get(i)[1]);driver.findElement(By.xpath("//*[@id='password']")).sendKeys(list.get(i)[2]);Thread.sleep(2000);driver.findElement(By.xpath("//*[@id='login_button']")).click();Thread.sleep(2000);try{driver.switchTo().alert().accept();Thread.sleep(2000);driver.findElement(By.xpath("//*[@id='username']")).clear();driver.findElement(By.xpath("//*[@id='password']")).clear();}catch(NoAlertPresentException NofindAlert){UserLogout(driver);}    }}public static void UserLogout(WebDriver driver) throws InterruptedException{driver.findElement(By.xpath("//*[@id='logout_button']")).click();Thread.sleep(2000);}
}

復制代碼

復制代碼

LoginTest.javapackage Test;import java.io.IOException;
import java.util.*;
import PublicMethods.*;import org.openqa.selenium.WebDriver;public class LoginTest {public static void main(String[] args) throws InterruptedException, IOException {// TODO Auto-generated method stubWebDriver driver = PublicMethods.share.OpenDriver("file:///D:/%E7%99%BB%E5%BD%95.html");String filename = "D:\\app_tool\\eclipse-workspace\\AutoTest\\TestData\\user_info.csv";ArrayList<String[]> list = csvData(filename);UserLogin(driver, list);driver.quit();}
}

復制代碼

Python

復制代碼

data.pyimport csvclass data():# 讀取CSV文件def csvData(self, fileName):lines = csv.reader(open(fileName, 'r'))return lines

復制代碼

復制代碼

share.pyfrom time import *
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as ECclass share():# 啟動瀏覽器def open_driver(self, url):driver = webdriver.Firefox()driver.implicitly_wait(10)driver.get(url)return driver# 登錄賬號檢測def user_login(self, driver, lines):for line in lines:sleep(2)driver.find_element(By.XPATH, "//*[@id='username']").send_keys(line[0])driver.find_element(By.XPATH, "//*[@id='password']").send_keys(line[1])sleep(2)driver.find_element(By.XPATH, "//*[@id='login_button']").click()sleep(2)result =EC.alert_is_present()(driver)# 判斷是否有彈窗if result:result.accept()driver.find_element(By.XPATH, "//*[@id='username']").clear()driver.find_element(By.XPATH, "//*[@id='password']").clear()# 退出賬號def user_logout(self, driver):driver.find_element(By.XPATH, "//*[@id='logout_button']").click()sleep(2)

復制代碼

復制代碼

LoginTest.pyfrom public import share,datadriver = share.share().open_driver('file:///D:/%E7%99%BB%E5%BD%95.html')filename = 'user_info.csv'
lines = data.data().csvData(filename)share.share().user_login(driver, lines)
share.share().user_logout(driver)
driver.quit()

復制代碼

Ruby

讀取excel文件

Excel文件數據必須時文本格式

Java

進入http://poi.apache.org/download.html下載POI的Jar包
問題一:
?

圖片.png


解決方法:
進入http://mvnrepository.com/artifact/org.apache.xmlbeans/xmlbeans/2.6.0,下載jar包

問題二:
?

圖片.png


解決方法:
進入http://mvnrepository.com/artifact/org.apache.commons/commons-collections4/4.1,下載jar包

問題三:
在遇到Excel單元值為空時sheet.getRow(i).getCell(j).getStringCellValue()會報錯
解決方法:
在Excel中把空值改為空格,然后在代碼中獲取該值后去空格。

復制代碼

data.javapackage PublicMethods;import java.io.*;
import java.util.*;public class data {//讀取Excel文件public static XSSFSheet excelData(String fileName) throws IOException{File file = new File(fileName);FileInputStream is = new FileInputStream(file);XSSFWorkbook wb = new XSSFWorkbook(is); //加載workbookXSSFSheet sheet = wb.getSheetAt(0);  //加載sheetreturn sheet;}
}

復制代碼

復制代碼

share.javapackage PublicMethods;import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.openqa.selenium.By;
import org.openqa.selenium.NoAlertPresentException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;public class share {private static WebDriver driver;public static WebDriver OpenDriver(String url){driver = new FirefoxDriver();driver.get(url);return driver;}public static void UserLogin(WebDriver driver, XSSFSheet sheet) throws InterruptedException {for(int i=0;i<sheet.getLastRowNum();i++) {Thread.sleep(2000);driver.findElement(By.xpath("//*[@id='username']")).sendKeys(sheet.getRow(i).getCell(1).getStringCellValue().toString().trim());driver.findElement(By.xpath("//*[@id='password']")).sendKeys(sheet.getRow(i).getCell(2).getStringCellValue().toString().trim());Thread.sleep(2000);driver.findElement(By.xpath("//*[@id='login_button']")).click();Thread.sleep(2000);try{driver.switchTo().alert().accept();Thread.sleep(2000);driver.findElement(By.xpath("//*[@id='username']")).clear();driver.findElement(By.xpath("//*[@id='password']")).clear();}catch(NoAlertPresentException NofindAlert){UserLogout(driver);}    }}public static void UserLogout(WebDriver driver) throws InterruptedException{driver.findElement(By.xpath("//*[@id='logout_button']")).click();Thread.sleep(2000);}
}

復制代碼

復制代碼

LoginTest.javapackage Test;import java.io.IOException;
import PublicMethods.*;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.openqa.selenium.WebDriver;public class LoginTest {public static void main(String[] args) throws InterruptedException, IOException {// TODO Auto-generated method stubWebDriver driver = PublicMethods.share.OpenDriver("file:///D:/%E7%99%BB%E5%BD%95.html");String filename = "D:\\app_tool\\eclipse-workspace\\AutoTest\\TestData\\user_info.xlsx";XSSFSheet sheet = excelData(filename);UserLogin(driver, sheet);driver.quit();}
}

復制代碼

Python

復制代碼

data.pyimport xlrdclass data():# 讀取excel文件def execelData(self, fileName, sheetName):data = xlrd.open_workbook(fileName)#  通過索引順序獲取# table = data.sheets()[0]# table = data.sheet_by_index(0)table = data.sheet_by_name(sheetName)# 獲取一行或一列的值,參數是第幾行# table.row_values(0)    獲取第一行的值# table.col_values(0)    獲取第一列的值return  table

復制代碼

復制代碼

share.pyfrom time import *
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as ECclass share():# 啟動瀏覽器def open_driver(self, url):driver = webdriver.Firefox()driver.implicitly_wait(10)driver.get(url)return driver# 登錄賬號檢測def user_login(self, driver, table):rows = table.nrowsfor i in range(rows):sleep(2)driver.find_element(By.XPATH, "//*[@id='username']").send_keys(table.cell(i, 1).value)driver.find_element(By.XPATH, "//*[@id='password']").send_keys(table.cell(i, 2).value)sleep(2)driver.find_element(By.XPATH, "//*[@id='login_button']").click()sleep(2)result =EC.alert_is_present()(driver)# 判斷是否有彈窗if result:result.accept()driver.find_element(By.XPATH, "//*[@id='username']").clear()driver.find_element(By.XPATH, "//*[@id='password']").clear()# 退出賬號def user_logout(self, driver):driver.find_element(By.XPATH, "//*[@id='logout_button']").click()sleep(2)

復制代碼

復制代碼

LoginTest.pyfrom public import share,datadriver = share.share().open_driver('file:///D:/%E7%99%BB%E5%BD%95.html')filename = 'TestData/user_info.xlsx'
sheetname = 'test'
table = data.data().execelData(filename, sheetname)share.share().user_login(driver, table)
share.share().user_logout(driver)
driver.quit()

復制代碼

Ruby

淺談關鍵字驅動測試

???????在數據驅動的基礎上,我們把“數據”轉化為“關鍵字”后,通過關鍵字的改變從而引起測試結果的變化。
???????為何我要在這里說明是“淺談”呢?在關鍵字驅動測試中,我們可以將測試的對象、滿足條件、傳輸值、斷言等,甚至是所需要讀取的外部文件以及外部類庫,所有的相關條件存儲在文件中(典型的關鍵字驅動工具:UFT)。我們可以將關鍵字以“填表格”形式寫入文件中,從而降低腳本的編寫難度。
???????正因如此,采用關鍵字驅動測試來編寫同樣的腳本需要較高的學習成本。同樣,這樣的框架越到后期越難維護,可靠性也會變差。所以,暫時不深入研究關鍵字驅動測試。

最后我邀請你進入我們的【軟件測試學習交流群:785128166】, 大家可以一起探討交流軟件測試,共同學習軟件測試技術、面試等軟件測試方方面面,還會有免費直播課,收獲更多測試技巧,我們一起進階Python自動化測試/測試開發,走向高薪之路

作為一個軟件測試的過來人,我想盡自己最大的努力,幫助每一個伙伴都能順利找到工作。所以我整理了下面這份資源,現在免費分享給大家,有需要的小伙伴可以關注【公眾號:程序員二黑】自提!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/712108.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/712108.shtml
英文地址,請注明出處:http://en.pswp.cn/news/712108.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

「優選算法刷題」:刪除字符串中的所有相鄰重復項

一、題目 給出由小寫字母組成的字符串 S&#xff0c;重復項刪除操作會選擇兩個相鄰且相同的字母&#xff0c;并刪除它們。 在 S 上反復執行重復項刪除操作&#xff0c;直到無法繼續刪除。 在完成所有重復項刪除操作后返回最終的字符串。答案保證唯一。 示例&#xff1a; 輸…

理解C#里面的集合有哪些?怎么用,什么是安全集合?

介紹 在C#中&#xff0c;集合是一種用于存儲和操作多個元素的數據結構。它們提供了各種操作&#xff0c;如添加、刪除、查找等&#xff0c;以及遍歷集合中的元素。集合通常根據其實現方式和行為特征進行分類。 集合繼承IEnumerable 在C#中&#xff0c;幾乎所有的集合類型都實現…

簡歷中自我評價,是否應該刪掉?

你好&#xff0c;我是田哥 年后&#xff0c;不少朋友已經開始著手準備面試了&#xff0c;準備面試的第一個問題就是&#xff1a;簡歷。 寫簡歷是需要一些技巧的&#xff0c;你的簡歷是要給面試官看&#xff0c;得多留點心。 很多簡歷上都會寫自我評價/個人優勢/個人總結等&…

2024有哪些免費的mac蘋果電腦深度清理工具?CleanMyMac X

蘋果電腦用戶們&#xff0c;你們是否經常感到你們的Mac變得不再像剛拆封時那樣迅速、流暢&#xff1f;可能是時候對你的蘋果電腦進行一次深度清理了。在這個時刻&#xff0c;擁有一些高效的深度清理工具就顯得尤為重要。今天&#xff0c;我將介紹幾款優秀的蘋果電腦深度清理工具…

一個Web3項目的收官之作,必然是友好的用戶界面(Web3項目三實戰之四)

正如標題所述,一個對用戶體驗友好的應用,總是會贏得用戶大加贊賞,這是毋庸置疑的。 甭管是web2,亦或是已悄然而至的Web3,能有一個外觀優美、用戶體驗效果佳的的界面,那么,這個應用無疑是個成功的案例。 誠然,Web3項目雖然核心是智能合約攥寫,但用戶界面也是一個DApp不…

【Leetcode每日一刷】哈希表|綱領、242.有效的字母異位詞、349. 兩個數組的交集

綱領 &#x1f517;代碼隨想錄理論部分 關于哈希表這個數據結構就不再重復講了&#xff0c;下面對幾個關鍵點記錄一下&#xff1a; 哈希碰撞 解決方法1&#xff1a;拉鏈法 解決方法2&#xff1a;線性探測法 下面針對做題要用到的三種結構講一下&#xff08;也是重復造輪子了…

vue.config.js publicPath 和 vue-router base 結合配置項目根目錄為二級目錄案例

背景: 同個域名下需要有 PC 管理后臺, H5 端, 企業微信 ......等多個端, 需要在一個域名下通過不同的路徑來區分不同的項目; 例如: abc.com/pc, abc.com/h5, abc.com/wx-work.... 此處做個記錄 步驟: 1. 修改 vue.config.js 中的 publicPath module.exports {outputDir:…

MATLAB|【免費】概率神經網絡的分類預測--基于PNN的變壓器故障診斷

目錄 主要內容 部分代碼 結果一覽 下載鏈接 主要內容 ?《MATLAB神經網絡43個案例分析》共有43章&#xff0c;內容涵蓋常見的神經網絡&#xff08;BP、RBF、SOM、Hopfield、Elman、LVQ、Kohonen、GRNN、NARX等&#xff09;以及相關智能算法&#xff08;SVM、決策…

Java 下載excel文件

一、背景 微信小程序需要導出excel文件&#xff0c;后端技術Java&#xff0c;前端使用uniapp框架&#xff0c;使用excel模板。 二、excel 報表模板 需要補充的內容是以下標記問號的&#xff0c;其中有個表格&#xff0c;內容是動態添加的 三、Java端代碼實現 關鍵步驟&…

Topaz Video AI:一鍵提升視頻品質,智能重塑影像魅力 mac/win版

Topaz Video AI是一款革命性的視頻智能處理軟件&#xff0c;它利用先進的機器學習和人工智能技術&#xff0c;為視頻創作者提供了前所未有的視頻增強和修復功能。無論您是專業視頻編輯師、攝影師&#xff0c;還是熱愛視頻創作的愛好者&#xff0c;Topaz Video AI都能幫助您輕松…

webpack打包效率優化,webpack打包體積優化

優化 webpack 打包效率的方法 使用增量構建和熱更新&#xff1a;在開發環境下&#xff0c;使用增量構建和熱更新功能&#xff0c;只重新構建修改過的模塊&#xff0c;減少整體構建時間。避免無意義的工作&#xff1a;在開發環境中&#xff0c;避免執行無意義的工作&#xff0c…

2403C++,C++20協程庫

原文 基于C20協程的http庫--cinatra cinatra是基于C20無棧協程實現的跨平臺,僅頭,高性能,易用的http/https庫(http1.1),包括httpserver和httpclient,功能完備,不僅支持最普通的getpost等請求,還支持restfulapi,websocket,chunked,ranges,multipart,靜態文件服務和反向代理等功…

Python程序的流程

歸納編程學習的感悟&#xff0c; 記錄奮斗路上的點滴&#xff0c; 希望能幫到一樣刻苦的你&#xff01; 如有不足歡迎指正&#xff01; 共同學習交流&#xff01; &#x1f30e;歡迎各位→點贊 &#x1f44d; 收藏? 留言?&#x1f4dd; 年輕是我們唯一擁有權利去編制夢想的時…

【前端素材】推薦優質后臺管理系統Annex平臺模板(附源碼)

一、需求分析 1、系統定義 后臺管理系統是一種用于管理網站、應用程序或系統的管理界面&#xff0c;通常由管理員和工作人員使用。它提供了訪問和控制網站或應用程序后臺功能的工具和界面&#xff0c;使其能夠管理用戶、內容、數據和其他各種功能。 2、功能需求 后臺管理系…

利用python爬取本站的所有博客鏈接

目錄 前因 首先的嘗試 解決辦法 導入包 定義一個json配置文件 打開瀏覽器執行操作 注意 提取源代碼并且進行篩選鏈接 執行結果 前因 由于自己要把csdn的博客同步到hugo中&#xff0c;把博客轉為md格式已經搞好了&#xff0c;但是由于csdn的圖片具有防盜鏈&#xff0c;…

vue實現商品評分效果(通過插件實現)

Vue.js 實現了一個簡單的商品評分功能。用戶可以通過點擊星星來修改商品的評分&#xff0c;并且評分顯示了相應的星星數。 廢話不多說&#xff0c;直接上代碼 方法一&#xff1a; <template><div><avue-form :model"formData"><avue-form-it…

2024年經典【自動化面試題】附答案

一、請描述一下自動化測試流程&#xff1f; 自動化測試流程一般可以分為以下七步&#xff1a; 編寫自動化測試計劃&#xff1b; 設計自動化測試用例&#xff1b; 編寫自動化測試框架和腳本&#xff1b; 調試并維護腳本&#xff1b; 無人值守測試&#xff1b; 后期腳本維…

【數據結構】深入探討二叉樹的遍歷和分治思想(一)

&#x1f6a9;紙上得來終覺淺&#xff0c; 絕知此事要躬行。 &#x1f31f;主頁&#xff1a;June-Frost &#x1f680;專欄&#xff1a;數據結構 &#x1f525;該文章主要講述二叉樹的遞歸結構及分治算法的思想。 目錄&#xff1a; &#x1f30d;前言&#xff1a;&#x1f30d;…

Sora 原理與技術實戰筆記一

b 站視頻合集 【AIX組隊學習】Sora原理與技術實戰&#xff1a;Sora技術路徑詳解 Sora 技術報告&#xff08;OpenAI&#xff09; huggingsd 文生圖視頻系列的一個開源項目 最強視頻生成模型Sora相關技術解析 https://github.com/lichao-sun/SoraReview 驚艷效果&#xff1a; 長…

【Linux】screen

文章目錄 一、screen二、功能三、使用3.1 安裝3.2 常用參數3.3 狀態3.4 使用3.4.1 終端列表3.4.2 新建screen3.4.3 detached3.4.4 回到終端3.4.5 清除終端 一、screen screen為多視窗管理程序。在服務器上搭建一些服務的時候&#xff0c;經常要用到screen命令。例如某些服務開…