軟件測試專家工具包3移動端

UI Automator

UI Automator提供了一組API來構(gòu)建基于交互UI的測試。API允許你執(zhí)行操作,如打開設(shè)置菜單,非常適合黑盒自動化測試,在測試代碼不依賴于應(yīng)用的內(nèi)部實(shí)現(xiàn)

uiautomatorviewer提供了一個方便的圖形用戶界面進(jìn)行掃描和分析在Android設(shè)備上當(dāng)前顯示的UI組件。您可以使用此工具來檢查的布局層次和查看UI組件。

UiDevice類可以訪問設(shè)備并進(jìn)行操作。你可以調(diào)用它的方法來訪問設(shè)備屬性,如當(dāng)前的方向或顯示尺寸。該UiDevice類也讓您執(zhí)行操作,例如:旋轉(zhuǎn)設(shè)備;按下D-pad按鈕;按Back、Home、Menu等;打開通知樹欄;當(dāng)前窗口截圖等。

應(yīng)用相關(guān)的API: UiCollection枚舉容器的UI元素以計數(shù),或通過文字(或?qū)傩缘?針定位子元素; UIObject表示是在設(shè)備上可見的UI元素; UiScrollable?:為可滾動UI容器提供查找支持; UiSelector?:查詢一個或者多個UI元素; Configurator: 設(shè)置參數(shù)。

圖片.png

示例:更改語言

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from uiautomator import device as d

d.screen.on()
d.press.home()
d(text=u"設(shè)置").click()
d(text=u"其他高級設(shè)置").click()
d(text=u"語言和輸入法").click()
d(text=u"中文 (簡體)").click()
d(text=u"English").click()

https://github.com/xiaocong/uiautomator

Appium

Appium是一個移動端的自動化框架,可用于測試原生應(yīng)用,移動網(wǎng)頁應(yīng)用和混合型應(yīng)用,且是跨平臺的。可用于IOS和Android以及firefox的操作系統(tǒng)。原生應(yīng)用是指用android或ios的sdk編寫的應(yīng)用,移動網(wǎng)頁應(yīng)用是指網(wǎng)頁應(yīng)用,類似于ios中safari應(yīng)用或者Chrome應(yīng)用或者類瀏覽器的應(yīng)用。混合應(yīng)用是指一種包裹webview的應(yīng)用,原生應(yīng)用網(wǎng)頁內(nèi)容交互性的應(yīng)用。跨平臺,是當(dāng)今比較流行的開源測試工具。

配置比uiautomator復(fù)雜,需要指定被測應(yīng)用。

圖片.png
圖片.png

示例:python代碼操作計算器

#-*-coding: utf-8 -*-
#coding=utf-8
from appium import webdriver
desired_caps = {}
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '4.4.4'
desired_caps['deviceName'] = 'baf59937'
desired_caps["unicodeKeyboard"]="True"  
desired_caps["resetKeyboard"]="True"  
desired_caps['appPackage'] = 'com.miui.calculator'  
desired_caps['appActivity'] = '.cal.CalculatorActivity'  
driver = webdriver.Remote('http://localhost:4723/wd/hub',desired_caps)  

driver.find_element_by_name("1").click()
driver.find_element_by_name("5").click()
driver.find_element_by_id("btn_plus").click()
driver.find_element_by_name("6").click()
driver.find_element_by_id("btn_equal").click()
driver.quit()
圖片.png

Eggplant

使用VNC server之類的網(wǎng)關(guān)。 支持iOS, Android,Windows Phone, BlackBerry,是基于圖像識別的測試工具。腳本:SenseTalk。不受坐標(biāo)限制。

腳本跨OS、不會修改應(yīng)用,能完全控制設(shè)備。

商業(yè)軟件 http://www.testplant.com/eggplant/testing-tools/

流行的軟件測試工具介紹
流行的軟件測試工具介紹

adb

adb用于獲取Android日志,android設(shè)備的日志存儲在設(shè)備的循環(huán)內(nèi)存緩沖區(qū)中。adb在android SDK的platform-tools目錄。首先在系統(tǒng)設(shè)置 - >開發(fā)人員設(shè)置中打開USB調(diào)試。

圖片.png

然后使用USB連接線將手機(jī)連接到計算機(jī)。運(yùn)行adb devices獲取連接的設(shè)備列表。

圖片.png

如果要將整個日志保存到文件而不進(jìn)行過濾,請使用命令“adb logcat> logs.txt“。


圖片.png

運(yùn)行命令“adb logcat | findstr Exception“僅顯示例外情況。Linux使用“adb logcat | grep Exception“。


圖片.png

或者,您可以從Google Play安裝logcat查看器(如Catlog)查看logcat條目。

圖片.png

CPU Monitor Advanced Lite

來自Google Play,用于監(jiān)控CPU,可以保存歷史記錄,并以圖形直觀展示,但是大陸的應(yīng)用市場貌似搜索不到。

通常使用替代:CPU Monitor(豌豆莢)、CPU-Z等。

流行的軟件測試工具介紹
流行的軟件測試工具介紹
流行的軟件測試工具介紹
流行的軟件測試工具介紹

TestObject

TestObject是擁有成百上千真實(shí)設(shè)備的測試平臺,可以直接通過瀏覽器訪問。上載APP然后可以查看執(zhí)行情況,支持Robotium, Espresso和Appium。

通常用于安卓機(jī)型的測試。

商業(yè)軟件:https://testobject.com/

有幾個類似的提供云測試服務(wù)的公司:

云測匯:https://www.yuncehui.cn/ 專注于性能測試

Testin: 即云測,http://testin.cn/ 支持Robotium、淘寶Athrun框架

易測云:支持Robotium、Athrun、Guerrilla等開源測試框架,并使用基于控件識別的、東軟自主研發(fā)的測試工具Radar。http://www.yiceyun.com/

以上幾家沒有TestObject強(qiáng)大,但是有中國特色的選擇之一。

流行的軟件測試工具介紹
流行的軟件測試工具介紹

Scan

IOS命令行工具:

圖片.png

ZAPTEST

用于測試跨平臺應(yīng)用程序的軟件測試自動化解決方案。ZAPTEST允許在任何現(xiàn)代操作系統(tǒng),移動設(shè)備或移動設(shè)備上測試任何基于GUI的軟件。包括iOS,Android,WinMo,Blackberry,Windows,Mac和Linux,并支持Agile和CI(DevOps)開發(fā)的測試。 社區(qū)版本是免費(fèi)的,允許您測試網(wǎng)絡(luò),新的Windows應(yīng)用程序或移動應(yīng)用程序。

圖片.png
圖片.png
圖片.png

Traceview

很好的性能分析的工具。它可以通過圖形化的方式讓我們了解我們要跟蹤的程序的性能,并且能具體到method。

記錄過程中每個API的耗時及調(diào)用次數(shù),出現(xiàn)卡頓時,可通過top排序等手段分析是哪些API引起的。

圖片.png

https://developer.android.com/studio/profile/traceview

Memory Profiler

Android Profiler 中的一個組件,可幫助您識別導(dǎo)致應(yīng)用卡頓、凍結(jié)甚至崩潰的內(nèi)存泄漏和流失。 它顯示一個應(yīng)用內(nèi)存使用量的實(shí)時圖表,讓您可以捕獲堆轉(zhuǎn)儲、強(qiáng)制執(zhí)行垃圾回收以及跟蹤內(nèi)存分配。

要打開 Memory Profiler,請按以下步驟操作:

點(diǎn)擊 View > Tool Windows > Android Profiler(也可以點(diǎn)擊工具欄中的 Android Profiler )。
從 Android Profiler 工具欄中選擇您想要分析的設(shè)備和應(yīng)用進(jìn)程。 如果您通過 USB 連接了某個設(shè)備但該設(shè)備未在設(shè)備列表中列出,請確保您已啟用 USB 調(diào)試。
點(diǎn)擊 **MEMORY **時間線中的任意位置可打開 Memory Profiler。

或者,您可以在命令行中使用 dumpsys 檢查您的應(yīng)用內(nèi)存,同時查看 logcat 中的 GC Event。

https://developer.android.com/studio/profile/memory-profiler

圖片.png

Systrace

Systrace的功能包括跟蹤系統(tǒng)的I/O操作、內(nèi)核工作隊(duì)列、CPU負(fù)載以及Android各個子系統(tǒng)的運(yùn)行狀況等。

它能展示API的執(zhí)行時序、耗時及各線程狀態(tài),出現(xiàn)卡頓時可分析API調(diào)用邏輯是否合理及是否出現(xiàn)主線程阻塞。

圖片.png

https://github.com/catapult-project/catapult/tree/master/systrace

AndroidJUnitRunner

AndroidJUnitRunner類是JUnit測試運(yùn)行器,可以讓你在Android設(shè)備上執(zhí)行JUnit3或JUnit4中風(fēng)格的測試類,兼容Espresso和UI Automator測試框架。測試運(yùn)行器加載測試包和應(yīng)用,運(yùn)行測試并報告測試結(jié)果。該類取代 InstrumentationTestRunner類(僅支持JUnit 3)。

這個運(yùn)行器的主要特點(diǎn):

  • JUnit支持

  • 獲得Instrumentation信息

  • 測試篩選

  • 測試分片

要求的Android2.2(API 8)或更高。

AndroidJunitRunner通過InstrumentationRegistry提供了訪問instrumentation的API。

  • InstrumentationRegistry.getInstrumentation()返回當(dāng)前正在運(yùn)行的Instrumentation

  • InstrumentationRegistry.getContext()返回此Instrumentation軟件包的上下文。

  • InstrumentationRegistry.getTargetContext()返回目標(biāo)應(yīng)用的應(yīng)用上下文。

  • InstrumentationRegistry.getArguments()返回傳遞給此Instrumentation的參數(shù)Bundle。當(dāng)你要訪問命令行參數(shù)時非常有用。

測試運(yùn)行器兼容JUnit3和JUnit4的(最高JUnit4.10)測試。在同一個包混淆JUnit 3和和JUnit4測試代碼可能會導(dǎo)致不可預(yù)測的結(jié)果。instrumented JUnit 4測試類在設(shè)備或仿真器上運(yùn)行,必須在前面加上@RunWith(AndroidJUnit4.class)注釋。

比如測試CalculatorActivity類中的加操作:

import android.support.test.runner.AndroidJUnit4;
import android.support.test.runner.AndroidJUnitRunner;
import android.test.ActivityInstrumentationTestCase2;

@RunWith(AndroidJUnit4.class)
public class CalculatorInstrumentationTest
        extends ActivityInstrumentationTestCase2<CalculatorActivity> {
        
    @Before
    public void setUp() throws Exception {
        super.setUp();
        
        // Injecting the Instrumentation instance is required
        // for your test to run with AndroidJUnitRunner.
        injectInstrumentation(InstrumentationRegistry.getInstrumentation());
        mActivity = getActivity();
    }
    
    @Test
    public void typeOperandsAndPerformAddOperation() {
        // Call the CalculatorActivity add() method and pass in some operand values, then
        // check that the expected value is returned.
    }
    
    @After
    public void tearDown() throws Exception {
        super.tearDown();
    }
}

InstrumentationRegistry類可以訪問測試運(yùn)行的信息。該類包括Instrumentation對象,目標(biāo)應(yīng)用上下文對象,測試應(yīng)用上下文對象及傳遞到測試的命令行參數(shù)。

JUnit 4.x的測試可以使用annotation來配置測試運(yùn)行,并支持Androidannotation:

@RequiresDevice:物理設(shè)備上運(yùn)行。

@SdkSupress:限定最低SDK版本。例如@SDKSupress(minSdkVersion=18)
@SmallTest,@MediumTest和@LargeTest:測試分級。

單個test suite可以分片,同一Instrumentation的同一分片可以作為一個組。每個片都有索引號。當(dāng)運(yùn)行測試,使用-e numShards選項(xiàng)指定片數(shù)和-e shardIndex選項(xiàng)來指定要運(yùn)行的片。

例如分成10個碎片,僅執(zhí)行第二片測試,請使用以下命令:

adb shell am instrument -w -e numShards 10 -e shardIndex 2

Espresso

Espresso提供了一組API來構(gòu)建UI測試來測試用戶流程。這些API讓你寫簡潔和可靠運(yùn)行的自動化UI測試。Espresso非常適合白盒自動測試,測試代碼利用了被測應(yīng)用的代碼細(xì)節(jié)。

Espresso的主要特性:

  • 視圖匹配(View matching): 靈活的API用于查看和適配目標(biāo)應(yīng)用。

  • Action API:一套擴(kuò)展的action API自動化UI交互。

  • UI線程同步(UI thread synchronization)以提高測試的可靠性。

要求Android2.2(API 8)或更高。

Espresso.onView()方法可以訪問目標(biāo)應(yīng)用程序的UI組件并與之交互。該方法接受一個Matcher參數(shù),搜索視圖層來定位視圖實(shí)例。定位方法可以基于類名、內(nèi)容描述、R.id、顯示的文本。比如

onView(withId(R.id.my_button));

如果搜索成功,onView()方法返回對應(yīng)view的引用,可執(zhí)行用戶操作和斷言。

AdapterView由子view動態(tài)生成。如果目標(biāo)視圖在AdapterView(ListView或GridView)中,onView()方法可能不起作用,因?yàn)榭赡苤患虞d了一部分,Espresso.onData()則可以。

ViewActions可以執(zhí)行視圖點(diǎn)擊(View clicks),滑動(Swipes),按鍵或者按鈕(Key and button press)、文本輸入(Typing text)、打開鏈接(Opening a link)。

// Type text into an EditText view, then close the soft keyboard
onView(withId(R.id.editTextUserInput))
    .perform(typeText(STRING_TO_BE_TYPED), closeSoftKeyboard());
// Press the button to submit the text change
onView(withId(R.id.changeTextBt)).perform(click());

由于時間問題,在Android設(shè)備上測試隨機(jī)失敗。之前一般通過sleep和超時處理解決。Espresso測試框架處理Instrumentation和UI線程之間的同步,很好地解決了這些問題。

API參考:developer.android.com/reference/android/support/test/package-summary.html
測試參考:http://developer.android.com/training/testing/ui-testing/espresso-testing.html

robotium

Android用戶場景測試,在Espresso出來直接比較流行,現(xiàn)在有弱化的趨勢。

https://github.com/RobotiumTech/robotium

Genymotion

高效的安卓模擬器 http://www.genymotion.net/

圖片.png

Robolectric

開源。使用shadow objects運(yùn)行測試于普通的工作站/服務(wù)器JVM,它并不依賴于Android提供的測試功能,無須模擬器、設(shè)備,效率高。無須dexing(編譯成Dalvik VM使用的格式),打包,部署和運(yùn)行的過程。

是安卓單元測試的首選工具。

網(wǎng)址:pivotal.github.com/robolectric

Monkey

Monkey是Android中的命令行工具,可以運(yùn)行在模擬器里或?qū)嶋H設(shè)備中。它向系統(tǒng)發(fā)送偽隨機(jī)的用戶事件流(如按鍵輸入、觸摸屏輸入、手勢輸入等),實(shí)現(xiàn)對正在開發(fā)的應(yīng)用程序進(jìn)行壓力測試。Monkey測試是一種為了測試軟件的穩(wěn)定性、健壯性的快速有效的方法。

https://developer.android.com/studio/test/monkey

Android Lint

Android Studio 提供一個名為 Lint 的代碼掃描工具,可幫助您發(fā)現(xiàn)并糾正代碼結(jié)構(gòu)質(zhì)量的問題,而無需實(shí)際執(zhí)行該應(yīng)用,也不必編寫測試用例。該工具會報告其檢測到的每個問題并提供該問題的描述消息和嚴(yán)重級別,以便您可以快速確定需要優(yōu)先進(jìn)行哪些關(guān)鍵改進(jìn)。此外,您可以調(diào)低問題的嚴(yán)重級別,忽略與項(xiàng)目無關(guān)的問題,也可以調(diào)高嚴(yán)重級別,以突出特定問題。

Lint 工具可檢查您的 Android 項(xiàng)目源文件是否包含潛在錯誤,以及在正確性、安全性、性能、易用性、便利性和國際化方面是否需要優(yōu)化改進(jìn)。在使用 Android Studio 時,配置的 Lint 和 IDE 檢查會在您每次構(gòu)建應(yīng)用時運(yùn)行。不過,您可以手動運(yùn)行檢查或從命令行運(yùn)行 Lint。

圖片.png

https://developer.android.com/studio/write/lint?hl=zh-cn#commandline

兼容性測試套件 (CTS)

兼容性測試套件 (CTS) 是一個免費(fèi)的商業(yè)級測試套件CTS 代表兼容性的“機(jī)制”。

CTS 在桌面設(shè)備上運(yùn)行,并直接在連接的設(shè)備或模擬器上執(zhí)行測試用例。CTS 是一套單元測試,旨在集成到工程師構(gòu)建設(shè)備的日常工作流程(例如通過連續(xù)構(gòu)建系統(tǒng))中。其目的是盡早發(fā)現(xiàn)不兼容性,并確保軟件在整個開發(fā)過程中保持兼容性。

CTS 是一個自動化測試工具,其中包括兩個主要軟件組件:

CTS tradefed 自動化測試框架會在桌面設(shè)備上運(yùn)行,并管理測試執(zhí)行情況。

單獨(dú)的測試用例會在被測設(shè)備 (DUT) 上執(zhí)行。測試用例采用 Java 語言編寫為 JUnit 測試,并打包為 Android .apk 文件,以在實(shí)際目標(biāo)設(shè)備上運(yùn)行。

兼容性測試套件驗(yàn)證程序(CTS 驗(yàn)證程序)是對 CTS(可在此處下載)的補(bǔ)充。CTS 驗(yàn)證程序?yàn)闊o法在沒有手動輸入(例如音頻質(zhì)量、加速度計等)的固定設(shè)備上進(jìn)行測試的 API 和功能提供測試。

CTS 驗(yàn)證程序是一款手動測試工具,包含以下軟件組件:

在 DUT 上執(zhí)行并收集結(jié)果的 CTS 驗(yàn)證程序應(yīng)用。

在桌面設(shè)備上執(zhí)行,以便為 CTS 驗(yàn)證程序應(yīng)用中的某些測試用例提供數(shù)據(jù)或額外控制的可執(zhí)行文件或腳本。

圖片.png

monkey runner

monkeyrunner工具提供了API,使用此API寫出的程序可以在Android代碼之外控制Android設(shè)備和模擬器。通過monkeyrunner,您可以寫出一個Python程序去安裝一個Android應(yīng)用程序或測試包,運(yùn)行它,向它發(fā)送模擬擊鍵,截取它的用戶界面圖片,并將截圖存儲于工作站上。monkeyrunner工具的主要設(shè)計目的是用于測試功能/框架水平上的應(yīng)用程序和設(shè)備,或用于運(yùn)行單元測試套件,但您當(dāng)然也可以將其用于其它目的。

下面是簡單的monkeyrunner程序,它連接到設(shè)備,創(chuàng)建MonkeyDevice對象。 程序使用MonkeyDevice對象安裝Android應(yīng)用程序包,運(yùn)行activity,并將關(guān)鍵事件發(fā)送到activity。 然后程序截取結(jié)果的屏幕截圖,創(chuàng)建MonkeyImage對象。 從該對象,程序輸出包含屏幕截圖的.png文件。

# Imports the monkeyrunner modules used by this program
from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice

# Connects to the current device, returning a MonkeyDevice object
device = MonkeyRunner.waitForConnection()

# Installs the Android package. Notice that this method returns a boolean, so you can test
# to see if the installation worked.
device.installPackage('myproject/bin/MyApplication.apk')

# sets a variable with the package's internal name
package = 'com.example.android.myapplication'

# sets a variable with the name of an Activity in the package
activity = 'com.example.android.myapplication.MainActivity'

# sets the name of the component to start
runComponent = package + '/' + activity

# Runs the component
device.startActivity(component=runComponent)

# Presses the Menu button
device.press('KEYCODE_MENU', MonkeyDevice.DOWN_AND_UP)

# Takes a screenshot
result = device.takeSnapshot()

# Writes the screenshot to a file
result.writeToFile('myproject/shot1.png','png')

DDMS

DDMS 的全稱是DalvikDebug Monitor Service,是 Android 開發(fā)環(huán)境中的Dalvik虛擬機(jī)調(diào)試監(jiān)控服務(wù)。提供測試設(shè)備截屏、查看特定進(jìn)程正在運(yùn)行的線程以及堆信息、Logcat、廣播狀態(tài)信息、模擬電話呼叫、模擬接收及發(fā)送SMS、虛擬地理坐標(biāo)等服務(wù)。

https://developer.android.com/studio/profile/monitor

openstf

通過瀏覽器控制管理多臺安卓設(shè)備。

https://github.com/openstf/stf

參考資料

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,885評論 6 541
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,312評論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,993評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,667評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,410評論 6 411
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,778評論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,775評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,955評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,521評論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,266評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,468評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,998評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,696評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,095評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,385評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,193評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,431評論 2 378

推薦閱讀更多精彩內(nèi)容