導航:首頁 > 操作系統 > android模塊測試

android模塊測試

發布時間:2024-03-14 12:23:33

㈠ 做android手機軟體測試需要掌握哪些工具

請注意測試本身不是靠工具的而是靠設計,這是我的理念,所以我一向覺得,很多人認為做測試做的好就是靠掌握一門好的工具,這個觀點是不正確的,所以我可以負責任的告訴你,做Android手機需要掌握的不是工具、而是理念、思維、以及框架,總的來說是本質,而工具只是輔助,那麼現在我來介紹一些我了解的工具(僅僅是了解,很多沒用過)
開源 Android 軟體測試工具包括:Android Test Kit, AndroidJUnit4, Appium, calabash-android, Monkey, MonkeyTalk, NativeDriver, Robolectric, RoboSpock, Robotium, UIAutomator, Selendroid。
Android Test Kit
Android Test Kit 是一組 Google 開源測試工具,用於 Android 平台,包含 Espresso API 可用於編寫簡潔可靠的 Android UI 測試。
AndroidJUnit4
AndroidJUnit4 是一個讓 JUnit 4 可以直接運行在 Android 設備上的開源命令行工具。
Appium
Appium 是一個開源、跨平台的自動化測試工具,用於測試原生和輕量移動應用,支持 iOS, Android 和 FirefoxOS 平台。Appium 驅動蘋果的 UIAutomation 庫和 Android 的 UiAutomator 框架,使用 Selenium 的 WebDriver JSON 協議。Appinm 的 iOS 支持是基於 Dan Cuellar's 的 iOS Auto. Appium 同時綁定了 Selendroid 用於老的 Android 平台測試。
Calabash-android
calabash-android 是一個基於 Cucumber 的 Android 的功能自動化測試框架。Calabash 允許你寫和執行,是開源的自動化移動應用測試工具,支持 Android 和 iOS 原生應用。Calabash 的庫允許原生和混合應用的交互測試,交互包括大量的終端用戶活動。Calabash 可以媲美 Selenium WebDriver。但是, 需要注意的是 web 應用和桌面環境的交互跟觸摸屏應用的交互是不同的。Calabash 專為觸摸屏設備的原生應用提供 APIs。
Monkey
Monkey 是 Google 開發的 UI/應用測試工具,也是命令行工具,主要針對壓力測試。你可以在任意的模擬器示例或者設備上運行。Monkey 發送一個用戶事件的 pseudo-random 流給系統,作為你開發應用的壓力測試。
MonkeyTalk
MonkeyTalk 是世界上最強大的移動應用測試工具。MonkeyTalk 自動為 iOS 和 Android 應用進行真實的,功能性交互測試。MonkeyTalk 提供簡單的 "smoke tests",復雜數據驅動的測試套件。MonkeyTalk 支持原生,移動和混合應用,真實設備或者模擬器。MonkeyTalk 使得場景捕獲非常容易,可以記錄高級別,可讀的測試腳本。同樣的命令可以用在 iOS 和 Android 應用上。你可以記錄一個平台的一個測試,並且可以在另外一個平台回放。MonkeyTalk 支持移動觸摸和基於手勢交互為主的移動體驗。點擊,拖拽,移動,甚至是手指繪制也可以被記錄和回放。
NativeDriver
NativeDriver 是 WebDriver API 的實現,是原生應用 UI 驅動,而不是 web 應用。
Robolectric
Robolectric 是一款Android單元測試框架,使用 Android SDK jar,所以你可以使用測試驅動開發 Android 應用。測試只需幾秒就可以在工作站的 JVM 運行。Robolectric 處理視圖縮放,資源載入和大量 Android 設備原生的 C 代碼實現。Robolectric 允許你做大部分真實設備上可以做的事情,可以在工作站中運行,也可以在常規的 JVM 持續集成環境運行,不需要通過模擬器。
RoboSpock
RoboSpock 是一個開源的 Android 測試框架。提供簡單的編寫 BDD 行為驅動開發規范的方法,使用Groovy 語音,支持 Google Guice 庫。RoboSpock 合並了 Robolectric 和 Spock 的功能。
Robotium
Robotium 是一款國外的Android自動化測試框架,主要針對Android平台的應用進行黑盒自動化測試,它提供了模擬各種手勢操作(點擊、長 按、滑動等)、查找和斷言機制的API,能夠對各種控制項進行操作。Robotium結合Android官方提供的測試框架達到對應用程序進行自動化的測 試。另外,Robotium 4.0版本已經支持對WebView的操作。Robotium 對Activity,Dialog,Toast,Menu 都是支持的。
UIAutomator
uiautomator 測試框架提高用戶界面(UI)的測試效率,通過自動創建功能 UI 測試示例,可以在一個或者多個設備上運行你的應用。
Selendroid
Selendroid 是一個 Android 原生應用的 UI 自動化測試框架。測試使用 Selenium 2 客戶端 API 編寫。Selendroid 可以在模擬器和實際設備上使用,也可以集成網格節點作為縮放和並行測試。

㈡ 如何使用python做android的自動化測試

開始第一個簡單的Android UI自動化測試
1.使用adb命令連接真機或模擬器
2.打開uiautomatorviewer工具
3.使用uiautomatorviewer工具獲取應用的元素進行定位
4.簡單介紹unittest框架的使用方法
5.使用Python編寫貓寧考勤應用注冊模塊的自動化測試
1.使用adb命令連接真機或模擬器:
手機USB連接電腦,進入開發者模式;
cmd命令:adb devices ,查看手機是否連接
這里寫圖片描述
顯示錯誤
這是因為adb的埠被佔用,我們需要查看是什麼應用佔用了這個埠(5037為adb默認埠)
cmd命令 : netstat -aon|findstr 「5037」
這里寫圖片描述
可以看到佔用5037埠對應的程序的PID號為8388;
cmd命令 : tasklist|findstr 「8388」
這里寫圖片描述
可以看出8388對應的程序為kadb.exe,說明該程序正在使用5037埠;
這時我們需要在任務管理器中結束kadb.exe進程,按快捷鍵「Ctrl+Shift+Esc」調出Windows任務管理器,找到「kadb.exe」,單擊下方的結束進程即可!
這里寫圖片描述
我們再次運行cmd命令:adb devices
這里寫圖片描述
這一步成功後我們才能運行sdk自帶的uiautomatorviewer;
我們需要用uiautomatorviewer工具來獲取元素,用於定位。
cmd命令:uiautomatorviewer,打開uiautomatorviewer界面
這里寫圖片描述
或者找到sdk目錄:sdk\tools中找到uiautomatorviewer.bat文件雙擊運行
這里寫圖片描述
2.打開uiautomatorviewer工具
這里寫圖片描述
我們可以根據text,resource-id,class等元素進行定位
3.使用uiautomatorviewer工具獲取應用的元素進行定位
這里我使用python自帶的IDLE進行編寫測試腳本,打開python文件找到IDLE(python GUI)雙擊打開,如圖:
這里寫圖片描述
4.簡單介紹unittest框架的使用方法
# -*- coding:utf-8 -*-
from uiautomator import device as d
import unittest
class Mytest(unittest.TestCase):
#初始化工作
def setUp(self):
print "--------------初始化工作"
#退出清理工作
def tearDown(self):
print "--------------退出清理工作"
#測試點擊貓寧考勤case
def test_login(self):
d(text="貓寧考勤").click()
print "--------------測試1"
#測試2
def test_z(self):
print "--------------測試2" #這里你可以寫你的第二個測試用例,
#測試3
def test_w(self):
print "--------------測試3" #這里你可以寫你的第三個測試用例。。。。。。。。。。。。。
if __name__ == '__main__':
unittest.main()
結果如下:
Testing started at 21:14 …
————–初始化工作
————–測試1
————–退出清理工作
————–初始化工作
————–測試3
————–退出清理工作
————–初始化工作
————–測試2
————–退出清理工作
Process finished with exit code 0
從結果中我們可以看出unittest框架的運行方式為:
setUp 測試1 tearDown
setUp 測試2 tearDown
setUp 測試3 tearDown
5.使用Python編寫貓寧考勤應用注冊模塊的自動化測試
# -*- coding:utf-8 -*-
from uiautomator import device as d
import time
import unittest
class MyTestSuite(unittest.TestCase):
# 初始化工作
def setUp(self):
print "--------------初始化工作"
# 退出清理工作
def tearDown(self):
print "--------------退出清理工作"
#***************************方法**************************************
# 判斷控制項是否存在 & text
def check_controls_exists(self, controls_text):
if d(text=controls_text).exists:
return 1
else:
return 0
# 判斷按鈕是否置灰 & text & clickable
def check_controls_click_text(self, controls_text):
if d(text=controls_text).info.get("clickable") is True:
return 1
else:
return 0
#assertIn(a, b) a in b
def check_ainb(self,resourceid,b):
if d(resourceId=resourceid).info.get("text") in b:
return 1
else:
return 0
#***********************************************************
# 注冊模塊
def test_Aregister(self):
try:
time.sleep(2)
#貓寧考勤開啟全新時代
self.assertEqual(self.check_controls_click_text("注冊"),1,u"貓寧考勤開啟全新時代")
# 貓寧考勤開啟全新時代--》點擊注冊按鈕進入注冊貓寧界面
d(text="注冊").click()
time.sleep(3)
#注冊貓寧界面
self.assertEqual(self.check_text("com.isentech.attendancet:id/regis_phone","請輸入手機號碼"),
1,u"注冊頁面-》請輸入手機號碼")
self.assertEqual(self.check_text("com.isentech.attendancet:id/regis_verifycode","請輸入驗證碼"),
1,u"注冊頁面-》請輸入驗證碼")
self.assertEqual(self.check_controls_click_text("獲取驗證碼"), 0,u"注冊頁面-》獲取驗證碼")
self.assertEqual(self.check_controls_click_text("《中科愛訊服務協議》"), 1,u"注冊頁面-》《中科愛訊服務協議》")
self.assertEqual(self.check_controls_click_text("注冊"), 0,u"注冊頁面-》注冊")
time.sleep(2)
#《中科愛訊服務協議》
d(text="《中科愛訊服務協議》").click()
time.sleep(2)
self.assertEqual(self.check_ainb("com.isentech.attendancet:id/title","服務協議"), 1,u"注冊頁面-》服務協議")
time.sleep(1)
d(resourceId="com.isentech.attendancet:id/title_back").click()
time.sleep(1)
#手機號不輸入是否能注冊
d(text="注冊").click()
time.sleep(3)
# 手機號只輸入1個數字是否能注冊&只輸入1個數字是否能獲取驗證碼
d(resourceId="com.isentech.attendancet:id/regis_phone").set_text("1")
self.assertEqual(self.check_controls_click_text("獲取驗證碼"), 0)
time.sleep(1)
d(text="注冊").click()
time.sleep(1)
d(resourceId="com.isentech.attendancet:id/regis_phone").clear_text()
time.sleep(1)
#只輸入5個數字是否能獲取驗證碼
d(resourceId="com.isentech.attendancet:id/regis_phone").set_text("11111")
self.assertEqual(self.check_controls_click_text("獲取驗證碼"), 0)
time.sleep(1)
d(resourceId="com.isentech.attendancet:id/regis_phone").clear_text()
time.sleep(1)
#只輸入手機號是否能注冊
d(resourceId="com.isentech.attendancet:id/regis_phone").set_text(phone_number)
self.assertEqual(self.check_controls_click_text("注冊"), 0)
time.sleep(1)
d(text="注冊").click()
time.sleep(1)
#輸入正確的驗證碼&獲取驗證碼是否高亮
d(resourceId="com.isentech.attendancet:id/regis_verifycode").set_text("5648")
time.sleep(1)
self.assertEqual(self.check_controls_click_text("獲取驗證碼"), 1)
time.sleep(2)
#密碼只輸入1個數字是否能注冊&注冊按鈕是否高亮
d(resourceId="com.isentech.attendancet:id/regis_pass").set_text("1")
d(resourceId="com.isentech.attendancet:id/regis_passAgain").set_text("1")
time.sleep(1)
self.assertEqual(self.check_controls_click_text("注冊"), 0,u"密碼只輸入1個數字是否能注冊")
time.sleep(1)
d(resourceId="com.isentech.attendancet:id/regis_pass").clear_text()
d(resourceId="com.isentech.attendancet:id/regis_passAgain").clear_text()
time.sleep(1)
#輸入不相同的密碼是否能注冊
d(resourceId="com.isentech.attendancet:id/regis_pass").set_text("123456")
d(resourceId="com.isentech.attendancet:id/regis_passAgain").set_text("12345")
time.sleep(1)
self.assertEqual(self.check_controls_click_text("注冊"), 0,u"輸入不相同的密碼是否能注冊")
time.sleep(1)
d(resourceId="com.isentech.attendancet:id/regis_pass").clear_text()
d(resourceId="com.isentech.attendancet:id/regis_passAgain").clear_text()
time.sleep(1)
#輸入正確的密碼是否能注冊&我已同意是否打鉤
d(resourceId="com.isentech.attendancet:id/regis_pass").set_text("123456")
d(resourceId="com.isentech.attendancet:id/regis_passAgain").set_text("123456")
time.sleep(1)
self.assertEqual(self.check_controls_click_resourceId("com.isentech.attendancet:id/regis_agree"), 1)
self.assertEqual(self.check_controls_click_text("注冊"), 1)
time.sleep(2)
d(text="注冊").click()
time.sleep(8)
except Exception, e:
print u"Error: 注冊模塊有問題\n", e
def test_app():
test_unit = unittest.TestSuite()
test_unit.addTest(MyTestSuite("test_Aregister"))
if __name__ == "__main__":
# 測試app
unittest.main()

㈢ 怎麼測試給資料庫加密的android模塊

1.概述

SharedPreferences是Android提供用來存儲一些簡單配置信息的機制,其以KEY-VALUE對的方式進行存儲,以便我們可以方便進行察簡讀取和存儲。主要可以用來存儲應用程序的歡迎語、常量參數或登錄賬號密碼等。

2.實例

(1)創建項目SharedPreferencesDemo項目

(2)編輯主界面的布局文件main.xml如下:

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

>

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="SharedPreferences,是Android提供用來存儲一些簡單的配置信息的一種機制。"

/>

(3)創建AES加解密工具類AESEncryptor.java

其中主要提供加密encrypt、解密decrypt兩個方法。(AES加解密演算法具體大家可以到網上搭手搜索相關資料)

以下為該類文件的源碼

package ni.demo.sharedpreferences;

import java.security.SecureRandom;

import javax.crypto.Cipher;

import javax.crypto.KeyGenerator;

import javax.crypto.SecretKey;

import javax.crypto.spec.SecretKeySpec;

/**

* AES加密器

* @author Eric_Ni

*

*/

public class AESEncryptor {

/**

* AES加密

*/

public static String encrypt(String seed, String cleartext) throws
Exception {

byte[] rawKey = getRawKey(seed.getBytes());

byte[] result = encrypt(rawKey, cleartext.getBytes());

return toHex(result);

}

/**

* AES解密

*/

public static String decrypt(String seed, String encrypted) throws
Exception {

byte[] rawKey = getRawKey(seed.getBytes());

byte[] enc = toByte(encrypted);

byte[] result = decrypt(rawKey, enc);

return new String(result);

}

private static byte[] getRawKey(byte[] seed) throws Exception {

KeyGenerator kgen = KeyGenerator.getInstance("AES"知沒嫌);

SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");

sr.setSeed(seed);

kgen.init(128, sr); // 192 and 256 bits may not be available

SecretKey skey = kgen.generateKey();

byte[] raw = skey.getEncoded();

return raw;

}

private static byte[] encrypt(byte[] raw, byte[] clear) throws Exception
{

SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");

Cipher cipher = Cipher.getInstance("AES");

cipher.init(Cipher.ENCRYPT_MODE, skeySpec);

byte[] encrypted = cipher.doFinal(clear);

return encrypted;

}

private static byte[] decrypt(byte[] raw, byte[] encrypted) throws
Exception {

SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");

Cipher cipher = Cipher.getInstance("AES");

cipher.init(Cipher.DECRYPT_MODE, skeySpec);

byte[] decrypted = cipher.doFinal(encrypted);

return decrypted;

}

public static String toHex(String txt) {

return toHex(txt.getBytes());

}

public static String fromHex(String hex) {

return new String(toByte(hex));

}

public static byte[] toByte(String hexString) {

int len = hexString.length()/2;

byte[] result = new byte[len];

for (int i = 0; i < len; i++)

result[i] = Integer.valueOf(hexString.substring(2*i, 2*i+2),
16).byteValue();

return result;

}

public static String toHex(byte[] buf) {

if (buf == null)

return "";

StringBuffer result = new StringBuffer(2*buf.length);

for (int i = 0; i < buf.length; i++) {

appendHex(result, buf[i]);

}

return result.toString();

}

private final static String HEX = "0123456789ABCDEF";

private static void appendHex(StringBuffer sb, byte b) {

sb.append(HEX.charAt((b>>4)&0x0f)).append(HEX.charAt(b&0x0f));

}

}

(4)編輯SharedPreferencesDemo.java

源碼如下:

package ni.demo.sharedpreferences;

import android.app.Activity;

import android.content.SharedPreferences;

import android.content.SharedPreferences.Editor;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.EditText;

import android.widget.Toast;

public class SharedPreferencesDemo extends Activity {

public static final String MY_PREFERENCES = "MY_PREFERENCES";
//Preferences文件的名稱

public static final String MY_ACCOUNT = "MY_ACCOUNT"; //

public static final String MY_PASSWORD = "MY_PASSWORD";

private EditText edtAccount;

private EditText edtPassword;

private Button btnClear;

private Button btnExit;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

edtAccount = (EditText)findViewById(R.id.edtAccount);

edtPassword = (EditText)findViewById(R.id.edtPassword);

//獲取名字為「MY_PREFERENCES」的參數文件對象,並獲得MYACCOUNT、MY_PASSWORD元素的值。

SharedPreferences sp = this.getSharedPreferences(MY_PREFERENCES, 0);

String account = sp.getString(MY_ACCOUNT, "");

String password = sp.getString(MY_PASSWORD, "");

//對密碼進行AES解密

try{

password = AESEncryptor.decrypt("41227677", password);

}catch(Exception ex){

Toast.makeText(this, "獲取密碼時產生解密錯誤!", Toast.LENGTH_SHORT);

password = "";

}

//將賬號和密碼顯示在EditText控制項上。

edtAccount.setText(account);

edtPassword.setText(password);

//獲取"清空"按鈕的對象,並為其綁定監聽器,如被點擊則清空賬號和密碼控制項的值。

btnClear = (Button)findViewById(R.id.btnClear);

btnClear.setOnClickListener(new OnClickListener(){

@Override

public void onClick(View arg0) {

edtAccount.setText("");

edtPassword.setText("");

}

});

//獲取「退出」按鈕的對象,並為其綁定監聽,如被點擊則退出程序。

btnExit = (Button)findViewById(R.id.btnExit);

btnExit.setOnClickListener(new OnClickListener(){

@Override

public void onClick(View arg0) {

SharedPreferencesDemo.this.finish();

}

});

}

@Override

protected void onStop() {

super.onStop();

//獲得賬號、密碼控制項的值,並使用AES加密演算法給密碼加密。

String account = edtAccount.getText().toString();

String password = edtPassword.getText().toString();

try{

password = AESEncryptor.encrypt("41227677", password);

}catch(Exception ex){

Toast.makeText(this, "給密碼加密時產生錯誤!", Toast.LENGTH_SHORT);

password = "";

}

//獲取名字為「MY_PREFERENCES」的參數文件對象。

SharedPreferences sp = this.getSharedPreferences(MY_PREFERENCES, 0);

//使用Editor介面修改SharedPreferences中的值並提交。

Editor editor = sp.edit();

editor.putString(MY_ACCOUNT, account);

editor.putString(MY_PASSWORD,password);

editor.commit();

}

}

(5)效果測試

首先,在AVD我們可以看到如下界面,在兩個控制項上我們分別輸入abc和123456。

接著,我們打開DDMS的File
Explore可以看到在data->data->ni->shared_prefs下面產生了一個名字叫做MY_PREFERENCES.xml的文件,該文件就是用來存儲我們剛才設置的賬號和密碼。

將其導出,並打開,可以看到如下內容:

abc這說明我們可以成功將賬號和加密後的密碼保存下來了。

最後,我們點擊「退出」按鈕將應用程序結束掉,再重新打開。我們又再次看到我們退出前的界面,賬號密碼已經被重新讀取出來。

文章的最後,我們進入Android API手冊,看看關於SharedPreferences的介紹:

Interface for accessing and modifying preference data returned by
getSharedPreferences(String, int). For any particular set of preferences, there
is a single instance of this class that all clients share. Modifications to the
preferences must go through an SharedPreferences.Editor object to ensure the
preference values remain in a consistent state and control when they are
committed to storage.

SharedPreferences是一個用來訪問和修改選項數據的介面,通過getSharedPreferences(Stirng,int)來獲得該介面。對於任何特別的選項集,只能有一個實例供所有客戶端共享。針對選項參數的修改必須通過一個SharedPreferences.Editor對象來進行,以保證所有的選項值保持在一個始終如一的狀態,並且通過該對象提交存儲。

可見,SharedPreferences操作選項文件時是線程安全的。

㈣ 如何使用python做android的自動化測試

一、首先說說手機自動化測試的原理 1、手機自動化測試的原理為PC上一個控制端(測試工具)與手機上的一個agent端,通過串口、USB或者無線方式將PC與手機終端相連,然後應用測試工具向手機發送請求或者命令,手機收到命令或者請求後,交給agent端解析,然後agent將這些解析的命令下發給手機的各個功能模塊所能識別的命令,調用那些功能模塊模擬操作。完成這些操作後,手機會返回一些信息,agent可以抓取這些信息,然後傳回給PC端,這樣就完成了一個完整的手機自動化測試。 2、關鍵點在於agent,有的公司是向自己的手機終端的軟體功能模塊中植入測試程序響應代碼,有的公司可以利用MMI_Command的方式來控制手機終端;原理就是給手機提供一個響應的介面。 3、而對於PC控制端,這個測試腳本用各種編程語言都可以,看如何定義 4、而又的自動化測試設計成錄制的機制,說通俗點,就是記錄手工操作的鍵盤信息或者LCD的操作信息(LCD需要用到智能識別機制) 5、自動化測試框架的搭建方法是通用的,你需要有一套自己的測試框架才能保證自動化測試的順利開展。 二、Android自動化測試方向: 1、CTS,CTS 測試基於Android instrumentation 測試, 其又基於JUnit 測試。說白了, CTS 就是一堆單元測試用例。這也是Java 語言的擅長部分。 2、 Monkey工具,Monkey是Android中的一個命令行工具,可以運行在模擬器里或實際設備中。它向系統發送偽隨機的用戶事件流(如按鍵輸入、觸摸屏輸入、手勢輸入等),實現對正在開發的應用程序進行壓力測試。Monkey測試是一種為了測試軟體的穩定性、健壯性的快速有效的方法。 3、ASE,ASE 意思為Android 腳本環境, 即我們可以通過腳本(比如Python)調用Android 的功能,從而定製一些測試。比如打電話,發簡訊,瀏覽網頁,等。我們可以擴充它的API(Java 部分), 並用python 腳本調用這些API, 從而實現豐富的測試功能。用於API 部分可以訪問到Android 全部API, python 又能靈活部署測試,所以ASE 的擴展性非常好。 4、Robotium,該工具用於黑盒的自動化測試。可以在有源碼或者只有APK 的情況下對目標應用 進行測試。Robotimu 提供了模仿用戶操作行為的API,比如在某個控制項上點擊,輸入Text 等等。(推舉你可以研究一下這個工具,開源的,我有資料) 5、可以自己開發一個手機方面的自動化測試工具,原理上一樣的 如果你想要什麼資料的話或者想一起學習研究的話,可以給我發郵件:[email protected]

閱讀全文

與android模塊測試相關的資料

熱點內容
企業內網加密app 瀏覽:49
騰訊雲伺服器怎麼設置本地網路 瀏覽:623
日常程序員 瀏覽:513
哪個pe有bit加密功能 瀏覽:108
rust伺服器是用什麼ip 瀏覽:692
java隨機字元串生成 瀏覽:551
數碼寶貝編程人物 瀏覽:390
php多用戶建站系統 瀏覽:624
加密防盜地上栓價位 瀏覽:671
比澤爾壓縮機下載 瀏覽:420
深圳壓縮機製造公司 瀏覽:882
如何給u盤單獨文件加密碼 瀏覽:284
恆溫機故障源碼 瀏覽:418
如何打開管家婆伺服器支持者 瀏覽:266
安卓手機自帶瀏覽器有什麼用 瀏覽:532
老闆咨詢阿里雲還是獨立伺服器 瀏覽:814
諾基亞手機app哪裡下載 瀏覽:520
看比賽用哪個app 瀏覽:977
如何評價如故app 瀏覽:152
建立表結構的命令 瀏覽:581