導航:首頁 > 編程語言 > python邏輯與界面分離

python邏輯與界面分離

發布時間:2022-10-21 05:32:12

『壹』 python中的邏輯代碼突然卡掉,邏輯思維養成

邏輯代碼突然短路,不知道怎麼寫,主要是沒有思路,邏輯思維的養成就現為重要,我們可以從下幾個方面養成。
邏輯思維的培養對軟體工程非常重要,思維快的能快速編寫邏輯代碼。可以從一下幾個方面進行慢慢培養。
第一:明確學習目的
邏輯思維學習編程對多數IT業人員來說都是非常有用的。學編程,做一名編程人員,從個人角度講,可以解決在軟體使用中所遇到的問題,改進現有軟體,可以為自己找到一份理想的工作添加重要得砝碼,有利於在求職道路上謀得一個好的職位;從國家的角度,可以為中國的軟體產業做出應有的貢獻,一名優秀的程序員永遠是被爭奪的對象。學習編程還能鍛煉思維,使我們的邏輯思維更加嚴密;能夠不斷享受到創新的樂趣,將一直有機會走在高科技的前沿,因為程序設計本身是一種創造性的工作。知識經濟時代給我們帶來了無限的機會,要想真正掌握計算機技術,並在IT行業里干出一番事業來,有所作為,具有一定的編程能力是一個基本條件和要求。
第二打好基礎,學好基礎知識對我們開發也很重要學編程要具備一定的基礎,總結之有以下幾方面:
首先是數學基礎 從計算機發展和應用的歷史來看計算機的數學模型和體系結構等都是有數學家提出的,最早的計算機也是為數值計算而設計的。因此,要學好計算機就要有一定的數學基礎,出學者有高中水平就差不多了。
其次是邏輯思維能力的培養 學程序設計要有一定的邏輯思維能力,「邏思力」的培養要長時間的實踐鍛煉。要想成為一名優秀的程序員,最重要的是掌握編程思想。要做到這一點必須在反復的實踐、觀察、分析、比較、總結中逐漸地積累。因此在學習編程過程中,我們不必等到什麼都完全明白了才去動手實踐,只要明白了大概,就要敢於自己動手去體驗。誰都有第一次。有些問題只有通過實踐後才能明白,也只有實踐才能把老師和書上的知識變成自己的,高手都是這樣成材的。最後是選擇一種合適的入門語言 面對各種各樣的語言,應按什麼樣的順序學呢?程序設計工具不外乎如下幾類: 1)本地開發 應用軟體開發的工具有:Visual Basic 、Delphi 、VC++ ( C++ Builder ) 等;資料庫開發工具有:Visual Foxpro 、Oracle Developer 、Power Builder 等。 2)跨平台開發 開發工具如 Java 等。 3)網路開發 對客戶端開發工具如:Java Script 等;對伺服器開發工具如:php 、ASP 、JSP 、ISAPI 、NSAPI 、CGI 等。 以上不同的環境下幾種開發工具中 VB 法簡單並容易理解,界面設計是可設化的,易學、易用。選 VB 作為入門的方向對出學者是較為適合的。
第三:注意理解一些重要概念
一本程序設計的書看到的無非就是變數、函數、條件語句、循環語句等概念,但要真正能進行編程應用,需要深入理解這些概念,在理解的基礎上應用,不要只簡單地學習語法、結構,而要吃透針對這些語法、結構的應用例子,做到舉一反三,觸類旁通。
第四:掌握編程思想,編程思想使用較多的就是oop編程思想
學習一門語言或開發工具,語法結構、功能調用是次要的,最主要是學習它的思想。例如學習 VC 就要學習 Windows 的內在機理、什麼是線程......;學習 COM 就要知道VTALBE 、類廠、介面、idl......,關鍵是學一種思想,有了思想,那麼我們就可以觸類旁通。
第六:多實踐、多交流,一切思維來自項目開發的積累
掌握編程思想必須在編程實際工作中去實踐和體會。編程起步階段要經常自己動手設計程序,具體設計時不要拘泥於固定的思維方式,遇到問題要多想幾種解決的方案。這就要多交流,各人的思維方式不同、角度各異,各有高招,通過交流可不斷吸收別人的長處,豐富編程實踐,幫助自己提高水平。親自動手進行程序設計是創造性思維應用的體現,也是培養邏輯思維的好方法。
第七:養成良好的編程習慣
編程入門不難,但入門後不斷學習是十分重要的,相對來說較為漫長。在此期間要注意養成一些良好的編程習慣。編程風格的好壞很大程度影響程序質量。良好的編程風格可以使
程序結構清晰合理,且使程序代碼便於維護。如代碼的縮進編排、變數命令規則的一致性、代碼的注釋等。
第八:上網學編程
在網上可以學到很多不同的編程思想、方法、經驗和技巧,有大量的工具和作品及相關的輔導材料供下載
8.加強計算機理論知識的再學習
思維培養學編程是符合「理論→實踐→再理論→再實踐」的一個認識過程。一開始要具有一定的計算機理論基礎知識,包括編程所需的數學基礎知識,具備了入門的條件,就可以
開始編程的實踐,從實踐中可以發現問題需要加強計算機理論知識的再學習。程序人人皆可編,但當你發現編到一定程度很難再提高的時候,就要回頭來學習一些計算機科學和數
學基礎理論。學過之後,很多以前遇到的問題都會迎刃而解,使人有豁然開朗之感。因此在學習編程的過程中要不斷地針對應用中的困惑和問題深入學習數據結構、演算法、計算機
原理、編譯原理、操作系統原理、軟體工程等計算機科學的理論基礎和數理邏輯、代數系統、圖論、離散數學等數學理論基礎知識。這樣經過不斷的學習,再努力地實踐,編程水平一定會不斷提高到一個新高度。
這就是總結出來的思維培養模式,希望能幫到你,謝謝!

『貳』 現在還有沒有人用python編程

面對珍珠(Perl)奪目之光、靈蛇(Python)更具有上天入地之能。它可以在 MS-DOS,Amiga,BeOS, OS/2,VMS,QNX等多種OS上運行;比 Perl 和 VB更快更好,比 C 和 C++ 語言更具擴充性;不僅在「星球大戰」、 「星球之旅(Star Trek)」等超級大片中當綱特技和動畫製作,還闖入了美國航天航空局控制室。真相如何,請看報道。

對 Perl (珍珠) 語言,互聯網開發人員可以說是無人不知、無人不曉;它運行迅捷、操作簡單,而且可以讓用戶在使用時感到其樂無窮。但它也有不竟如人意的時候:它的開放性同時帶來了它的復雜性,用它處理大項目時尤其會使人無從下手。

盡管如此,大部分互聯網項目仍得靠著 Perl 這員「功臣」來搭建。

但也並非別無選擇。最新推薦的軟體叫 Python (靈蛇),它的歷史僅有 Perl 的1/4,有著許多相似的特徵。

Python 的名字源於著名的滑稽團 Monty Python,它擁有許多廣為人知的演員,並塑造了許多婦孺皆知的銀屏形象。

那麼,互聯網世界中的 Python 又是怎樣的一個形象呢?

更快更好的 Python

與 Perl 一樣, Python 也是一種解釋語言,它完全採用面向對象的方式,語言結構介於 C 語言和 Perl 語言之間。雖然它被視作一種高極語言,但它的內置解釋器的功能卻非常基本,僅有幾種功能、操作符和關鍵詞便構成了整個程序語言。它的優勢可不僅如此,它還能通過一系列的模塊進行擴充。它既比 Perl 和 VB 語句更快更好,又比 C 和 C++ 語言更有擴充性。

同樣,Python 對程序語句的處理首先通過一個解釋和編譯系統轉換成為一系列的位元組代碼,然後再由 Python 的虛擬機進行處理。Python 設計得非常有效,主要歸功於它龐大的功能庫,因此用戶不用進入系統環境或是操作系統,也不用引用模塊。用 Python 編程,小程序還是小程序,不必勞費太多的成本和時間。

除了它的 Core 平台外, Python 還能在 MS-DOS,Amiga,BeOS, OS/2,VMS,QNX 以及其它許多操作系統上運行。甚至還可以在掌上電腦上運行 Python 程序。
面對珍珠(Perl)奪目之光、靈蛇(Python)更具有上天入地之能。

除了它的 Core 平台外, Python 還能在 MS-DOS,Amiga,BeOS, OS/2,VMS,QNX 以及其它許多操作系統上運行。甚至還可以在掌上電腦上運行 Python 程序。

Python 還有以下顯著的特徵:

超強的適應性

Python 可以由一系列的平台支持。它編譯完備的格式可以在 Windows 和 MacOS 及其自身 Tk 擴充平台上運行,並可用於開發對用戶友好的界面。在 UNIX 和其它平台上, Python 可以作為源代碼由程序員自行編譯,或者與其它預編的二進制編碼共同使用。它超強的適應性更能讓它有跨平台適用的能力:用它在 UNIX 平台上書寫的程序段95%的情況下無須作任何修改就可用於 Mac 和 PC 機。擴充 Tk 平台對它的支持,甚至可以讓基於GUI 格式的應用程序不用大動筋骨就可在上述三種平台上做自由切換,還保持著統一的界面。

正因為這種天然生就的跨平台運行能力,Python 還能支持一些平台的擴充平台,從而簡化和免除了對其它語言和環境的適應過程。與 SunOS / Solaris 工具帶有 Sun 音頻設備及 SGI版本帶有視音頻介面(包括 OpenGL)一樣,Windows Pytyon 解釋器也同樣帶有 Visual C++ 類庫和 Windows 音頻驅動介面。此外還有與 COM 對象進行通訊的功能。

超大的功能性

Python 幾乎無所不能。它的內核很小,但卻擁有足夠的基本程序塊用於設計大部分應用軟體。而且在某些情況下該程序語言還可以擴充與 C,C++ 和 Java 語言並用,因此沒有它編不了的程序。 Python 解釋器還帶有極為強大的補充模塊庫,用於擴充語言能力,進行網路通訊、文本處理和規則表達式匹配。

雖然 Python 的主要特點是隱去程序員的許多低級復雜工作,它還能支持鉤、擴充程序以及其它功能對某些操作系統進行低級接入。正因為這種高低兼行的特點,Python 可以視作和 C,Visual Basic 同等級別的語言,或是介於二者間的其它級別的語言。

超凡的擴容性

因為 Python 本身用 C 語言寫成(某些擴充平台採用C++語言編寫),而且它採用開放式的源代碼,這樣可以對程序本身進行主動擴充。另外該程序語言的許多模塊由 C 和 C++ 界面支持,包括一些諸如網路和DBM資料庫接入等基本構件,以及其它如 Tk 等許多先進工具。

此外,Python 還能融入 C 或 C++ 語言,從而可以使用 Python 語言為應用程序提供編程界面。也正基於它的跨語言開發的支持能力,還可以使用 Python 設計應用程序後再輸送到為 C 語言環境而無須將程序用 C 語言重寫,因為兩種語言均可同時使用。

JPython 是一個完全採用 Java 語言編寫的 Python 解釋器,這就意味著任何 Python 程序都可與一個 Java 對象或是使用 Python 對象的應用程序相聯結。

超常的簡易性

了解了 Python 以上幾個基本特點後,再對程序語言它內容進行了解就相對容易了。該語言內核很小,而且格式和文體簡明。由於所有其它的組件和擴充部分都使用完全一樣的句法結構,利用 Python 編程會很快讓人速成。

但這並不意味著 Python 語言就沒有復雜的地方。對其許多擴充部分和內庫都必需經過深思熟慮後方可進行有效的利用。

超強的功能性

擁有如此廣泛的支持和博採眾長的特徵,Python 在處理一系列問題上都顯得特別有效。以下為它的功能簡介:

計算器:

由 Python 支持的一個擴充程序叫 NumPy,它可以提供與許多標准數學庫相連的介面。Python 語言還擁有無限精確的特性,可以單獨處理100位數字的算術。

文字處理器:

Python 能夠對任何數據進行分割、累加和總結。它的模塊可以對日誌文件行中的元素進行分割,並根據內置的數據種類對其信息進行記錄和總結,最後才進行輸出。它的規則表達式庫使程序員可以使用 emacs,Perl 等等。 這再次證明 Python 的無所不能,曾經有程序員還利用 Python 編製成非常復雜的 SGML 處理工具。

便捷的應用開發:

Python對程序員而言一目瞭然,用它編程迅速有效。它博大的模塊庫可以提供針對不同協議、工具和庫的介面。免除重新開發之苦。

由於Python 還支持 Tk 工具,所以可以在幾個小時內完成一個應用軟體,而用 Perl 語言可能會需要2到3天,用 C 語言甚至要幾個星期。

跨平台開發:

Python 以中立方式支持不同的一系列平台,如果用戶使用的系統包含不同的平台,使用 Python 開發應用程序則再好不過;它這種適應性也可以為系統預留使用其它工具的可能。對於頻繁更換平台用戶,Python 是個理想的選擇。

為最終用戶提供軟體服務時,Python 也是個備選方案,可以避免同時用不同應用軟體編程的時間和費用。

系統設備

Python旨在避免操作系統中低級部分的滋擾,但如若需要主動進入這些低級部分時也完全可以通過相應的工具和擴充件來實現。與操作系統一樣, Python 可以進入相同的的功能,並予以備份和擴充,而且備份和擴充後的功能會增加 Python 的所有的適應性和介面能力。

互聯網程序設計

Python 帶有的標准模塊可以對網路插槽進行初級和協議級別的通訊,比如,如果要從 POP 伺服器上讀取電子郵件,Python 隨帶的庫模塊可以做到。另外, Python 還支持 XML、HTML和 CGI 庫文件,所以利用它可以解析用戶輸入的需求,並通過網路伺服器產生最佳質量的成果。

程序員還可為擁有 Python 內置解釋器的 Apache、Unix 和 Windows 網路伺服器編譯模塊。基於 CGI 程序的功效,可以很方便地執行 Python 語句而不用單獨裝載。

資料庫編程

Python 中有無數的擴充模塊可以連接如 Orcle、Informix 、mySOL和PostgreSql等通用的資料庫系統;還有稱作 Gadfly 的工具可以獨立Python 提供完全的SQL環境。Python 有強大的文本和數據處理能力,可以用它作為不同資料庫間的連接,比起那些資料庫附帶的總結和匯報工具顯得更有優勢。同時,由於它支持不同系統,用同樣的介面也可以連接任何資料庫。可以用 Tk 在支持平台上建立前端,馬上就可獲得高速跨平台、獨立資料庫的查詢工具。

其它

Python 應用范圍廣泛,幾乎沒有它不適配的語言;憑籍它的微小內核、豐富功能、多樣數據,Python 提供了一個良好的程序構建基礎。綜合了C 和 C++二者的優點,只要採用合適的結構和方式,便可對 Python 程序進行無限的擴充。除了一大堆顯著的優點,Python 也有缺點。

要列出 Python 的缺點確實不太容易。Python 在其擴充模塊中提供了大部分的功能,並充分顯示了對其增加功能有多容易,一旦用它還不能解決問題,那麼也僅需要利用 C 或 C++ 語言重新編寫一個擴充程序便可。

批評 Python 的人往往不是說Python 缺乏某種功能,而是對這種功能並不了解。通常還有一種抱怨說 Python 缺少規則表達式的支持-但實際上有兩個模塊可以用來處理規則表達式,其中之一還可以完全用來支持 Perl 語言的句式句法。對規則表達式的處理並沒有編進該語言中,但並不等於它作不到。

針對 Perl、Rebol 和 Java 語句而言, Python 的優勢在於它的內核很小。這減少了執行的時間,因為在運行時需要裝載的代碼較少,而且這個特點也使它有著更廣的適應性。

一旦熟悉了 Python 語句的簡明風格,它的強大優勢頓時便會凸現出來。用它編就的程序歷久不衰。

Python 的理想用戶群

它適合不同類型的用戶以解決不同類型的問題。大部分時候這些問題一般不為人所知,因為它們有著較高的保密性。也有大型公司用它進行商用開發,並展示開發所獲的成果。

紅帽 (Red Hat )曾用 Python 和 Tk 一起成功開發配置和管理操作系統的可視界面。整個系統可以全面控制 linux 操作系統,並根據用戶選擇對配置文件作自動更新。

Infoseek 在其公用搜索引擎使用了Python。該公司還用 Python 對其軟體進行定製,使最終用戶能對該網站內容進行方便下栽。

美國航空航天局也在不少領域中用到 Python 程序語言,最出名的莫過於在任務控制中心將 Python 用於任務計劃;對 Python 在其它方面的使用例如用其計算天體方位和設計衛星的路徑等等都充分體現了 Python 的超強計算能力。

以在「星球大站」、「阿貝斯 (Abyss)」、 「星球之旅 (Star Trek)」、 「印地安那瓊斯 (Indiana Jones)」超級大片中當綱特技和動畫製作的工業光魔公司 (Instrial Light)也採用 Python 製作商業動畫。
什麼是Python?
Python是一種即譯式的,互動的,面向對象的編程語言,它包含了模組式的操作,異常處理,動態資料形態,十分高層次的動態資料結構,以及類別的使用。Python揉合了簡單的語法和強大的功能。它的語法表達優美易讀。它具有很多優秀的腳本語言的特點:解釋的,面向對象的,內建的高級數據結構,支持模塊和包,支持多種平台,可擴展。而且它還支持互動式方式運行,圖形方式運行。它擁有眾多的編程界面支持各種操作系統平台以及眾多的各類函數庫。利用C和C++可以對它進行擴充。個別的應用軟體如果需要有一個可程序化界面也可以利用它來做為擴展語言用。最後,Python的可移植度非常高:它可以在許多的Unix類平台上運行,在Mac,MS-DOS,視窗Windows,Windows NT,OS/2,BeOS,以至RISCOS上都有相關的Python版本。

簡單的說它具有以下一些特徵:

l 是一種解釋性的,面向對象的,具有動態語義的程序設計語言。

l 適合快速開發。

l 能集成到其他流行的伺服器,也自帶伺服器。

l 提供清晰的數據/邏輯/表示的分離。

l 帶有可擴展的內置對象和強大的集成安全模塊。

Python的歷史

Python的創始人為Guido van Rossum。1989年聖誕節期間,在阿姆斯特丹,Guido為了打發聖誕節的無趣,決心開發一個新的腳本解釋程序,做為ABC語言的一種繼承。之所以選中Python(大蟒蛇的意思)作為程序的名字,是因為他是一個Monty 大蟒蛇飛行馬戲團的愛好者。

ABC是由Guido參加設計的一種教學語言(沒聽說過)。就Guido本人看來,ABC這種語言非常優美和強大,是專門為非專業程序員設計的。但是ABC語言並沒有成功,究其原因,Guido認為是非開放造成的。Guido決心在Python中避免這一錯誤(的確如此,Python與其它的語言如C,C++和Java結合的非常好)。同時,他還想實現在ABC中閃現過但未曾實現的東西。

就這樣,Python在Guido手中誕生了(真要感謝他)。實際上,第一個實現是在Mac機上。可以說,Python是從ABC發展起來,主要受到了Mola-3(另一種相當優美且強大的語言,為小型團體所設計的)的影響。並且結合了Unix Shell和C的習慣。

Python可用在哪些地方?

Python可以用在許多場合。當你需要大量的動態調整,要容易使用,功能強大並且富有彈性的情況,Python可以發揮很好的功效。

在處理文字方面,Python的核心功能(不需要任何擴充庫的情況下)比別的編程語言更為易用而且速度相當。這使Python在需要處理字元串的工作(包括系統管理,CGI編程)上成為高效的語言。

當Python加上它的標准擴充庫(如PIL,COM,Numeric,Oracledb,kjbuckets,tkinter,win32api,等等)或是特別擴充庫(你自己寫的,或是用SWING做的,或是利用ILU/COBRA/com的)後,它可以變成一個很好的「膠合語言」或者叫「指導語言」。就是指把不同的編程環境和互不相關的軟體功能整合的工具。例如把Numeric和Oracledb透過Python結合起來你就可以替你的資料庫數據做系統分析。Python的簡單、易用以及方便而強大的c/c++擴展方面使它成為一種十分優秀的「膠合語言」。

許多開發人員也在寫圖形用戶界面時廣泛的採用了Python。如果在Windows下,如果想做一個圖形界面程序,那麼Python可以勝任。可以去wxPython.org看一下,它是一個Python的擴展庫,可以用來實現跨平台的圖形編程,它支持windows和unix/linux。在那個網站上有一些演示,可以學習一下。Python可以做CGI。有些主頁提供了對Python的CGI支持。現在還有一些用Python做的游戲。如果想了解更多的Python可以做什麼,可以去SourceForge上查找有關Python的項目,上面有很多東西。

運行方式

Python可以以命令行方式運行,也可以互動式方式運行,還具有圖形集成環境,這樣開發Python就相當方便。現在已經出現了許多用Python編寫的可視化編程軟體,用於實現象Delphi一樣的功能。

面向對象

Python是一個真正的面向對象語言。它甚至支持異常的處理。如果學過Java,應該對這個不陌生。但其它的腳本語言,如PHP,好象就沒有。這使得程序的編寫更加清晰,而不需要許多的錯誤檢查了。

模塊和包

這一點更象是Java。對於Java的支持,大家可以了解JPython。JPython是用Java寫的Python,它完全支持Java,在這個環境下使用Python可以隨意地使用Java的類庫。語言擴展可以用C、C++或Java為Python編寫新的新言模塊,如函數。或者與Python直接編譯在一起,或者採用動態庫裝入方式實現。也專門有人編寫了一個工具,可以實現為Python自動實現函數介面封裝,這就是SWIG(Simplified Wrapper and Interface Generator),或稱做簡單封裝和介面生成器(可以在http://sourceforge.net/projects/swig/)。

有趣的語法

Guido認為Python的語法是非常優美的。其中一點就是,塊語句的表示不是C語言常用的{}對,或其它符號對,而是採用縮近表示法!有趣吧。就這一點來說,Guido的解釋是:首先,使用縮近表示法減少了視覺上的混亂,並且使程序變短,這樣就減少了需要對基本代碼單元注意的范圍;其次,它減少了程序員的自由度,更有利於統一風格,使得閱讀別人的程序更容易。感覺還是不錯的,就C語言來說,在if語句後面大括弧的寫法就好幾種,不同的人喜歡不同的樣子,還不如統一起來,都不會看得別扭。

在每個類或函數的定義後面,第一行可以是說明語句,根本不需要注釋符標記。對於後面跟塊語句的語句,後面應跟上一個冒號。一行語句不能太長,因為沒有行結束符,如果超長則要使用續行符(\\)。還有一些有趣的比如說,象下面的一個比較處理,用C語言為:

if (2

用Python可以表示為

if (2

什麼是Zope?

Zope是一個開放源代碼的Web應用伺服器,採用Python語言開發,使用它您可以方便的構建內容管理、內部網、門戶網站、和其他的定製應用。

l 高度面向對象的Web開發平台,採用Python語言開發。

l 可以運行在幾乎所有流行的操作系統上,支持多語言。

l 能集成到其他流行的伺服器,也自帶伺服器。

l 提供清晰的數據/邏輯/表示的分離 。

l 帶有可擴展的內置對象和強大的集成安全模塊。

什麼是Plone?

Pone是一個Zope上的一個用戶友好、功能強大的開放源代碼內容管理系統。Plone適合用作內部網/外部網的伺服器、文檔發布系統、門戶伺服器和異地協同群件工具,到目前,Plone其實已經發展成為了一個應用開發平台。

l 是一種功能強大的開放源碼(Open Source)內容管理系統(CMS) 。

l 通過Web瀏覽器來訪問、編輯內容和管理,易於更新內容 。

l 無需編程,即可創建新的內容類型 。

l 協同的編輯和發布機制 。

『叄』 python線程間通信的問題,回答有加分!300

pyqt的線程之間的通信是通過信號to槽來實現的,首先你在線程類裡面聲明一個全局槽比如:

classimThread(QtCore.QThread):
imslot=QtCore.pyqtSignal()

這里是要重點注意,上面的是沒有任何參數的一個信號,如果你需要參數的話,你可以在裡面添加參數類型,例如:

imslot1=QtCore.pyqtSignal(str)#這是一個帶字元串參數的信號
imslot2=QtCore.pyqtSignal(int)#這是一個帶整型參數的信號
imslot3=QtCore.pyqtSignal(bool)#這是一個帶布爾參數的信號

當然了,如果你需要多個參數的話,同樣地往裡面加就是了,qt也沒有要求參數必須是同類型的,所以可以這樣:

imslot1=QtCore.pyqtSignal(str,int)#這是一個帶整型和字元串的參數信號
imslot2=QtCore.pyqtSignal(int,str,str)#這是一個帶整型和兩個字元串的參數信號
imslot3=QtCore.pyqtSignal(bool,str)#這是一個帶布爾和字元串的參數信號

在線程的run方法裡面來定義執行信號:

self.imslot.emit()

這里也是需要重點注意的是,上面這個介面是沒有參數的,如果你是要參數的話,是需要這樣寫:

self.imslot1[str].emit('hello')
self.imslot2[int].emit(1)
self.imslot3[bool].emit(False)

多參數的是這樣

self.imslot1[str,int].emit('hello',1)
self.imslot2[int,str,str].emit(1,"hello","world")
self.imslot3[bool,str].emit(False,'hello')

以上就是在線程類裡面完成信號定義了,接下來就是邏輯層成定義一個函數槽來連接線程類裡面的信號,這個也很簡單,比如我在主線程類裡面定義一個方法:

defimSlot():
print'ok'

以上這個是槽函數,接下來是實現信號槽的連接

imThread.imslot.connect('imSlot')

這個就是信號槽的連接方式,當然了,這個是沒有參數的一個信號槽,那麼帶參數的怎麼寫呢?也很簡單!首先定義一個槽函數:

defimSlot(para):
printpara

這個是帶參數的槽函數,下面是:

imThread.imslot[str].connect('imSlot')

以上就是線程之間的方法了,子線程在執行的通行經過執行信號的話,子線程可以安全地執行而不會出現GUI主線程卡死的情況了。

『肆』 C/S架構,使用Python畫界面,go或者JAVA寫後台邏輯,有什麼優缺點

搞得好麻煩,為什麼不使用統一的開發工具呢,比如.net、delphi,一個就能解決問題了!
你使用多個語言開發維護都不好搞。

搞得好麻煩,為什麼不使用統一的開發工具呢,比如.net、delphi,一個就能解決問題了!
你使用多個語言開發維護都不好搞。
搞得好麻煩,為什麼不使用統一的開發工具呢,比如.net、delphi,一個就能解決問題了!
你使用多個語言開發維護都不好搞。

『伍』 python的思維邏輯怎麼樣

Python 是一個高層次的結合了解釋性、編譯性、互動性和面向對象的腳本語言。

Python 的設計具有很強的可讀性,相比其他語言經常使用英文關鍵字,其他語言的一些標點符號,它具有比其他語言更有特色語法結構。

Python 是一種解釋型語言: 這意味著開發過程中沒有了編譯這個環節。類似於PHP和Perl語言。

Python 是互動式語言: 這意味著,您可以在一個 Python 提示符 >>> 後直接執行代碼。

Python 是面向對象語言: 這意味著Python支持面向對象的風格或代碼封裝在對象的編程技術。

『陸』 qt可以實現界面和邏輯代碼分離嗎

想用python+qt的話那就不用說了,pyqt或者pyside都可以,當然了用pyqt的話要注意版權問題,實現界面邏輯分離的話可以用model/view結構來實現,這是qt自帶的一種方式.opengl我沒有做過,範例的話可以參考qt自帶的示例,雖然是c++寫的但是思路都是一樣的

『柒』 python 的優勢在哪裡

Python的優點
1、雖然Python可能被粗略地分類為"腳本語言"(script language),但實際上一些大規模軟體開發計劃例如Zope、Mnet及BitTorrent,Google也廣泛地使用它。Python的支持者較喜歡稱它為一種高級動態編程語言,原因是"腳本語言"泛指僅作簡單程序設計任務的語言,如shellscript、VBScript等只能處理簡單任務的編程語言,並不能與Python相提並論。
2、python嚴格說叫CPython,與C/c++有天然的融合性。這也是python強大的原因之一。在windows環境下可以使用ironpython,這個版本與vc可以結合的比較好。其它的平台可以使用eclipse,不過最好還是直接使用普通的文本編輯器。比較推薦的一個編輯器是sublime text2, geany, vi等。
3、python圖形化編程不難。當然MFC也不難。我不認為MFC有多難。其實學習起來只是略難,但是這不是一個數量級的。MFC可以生產出非常強勁的界面。而python界面多屬於簡單的。
4、Python本身被設計為可擴充的。並非所有的特性和功能都集成到語言核心。Python提供了豐富的API和工具,以便程序員能夠輕松地
使用C語言、C++、Cython來編寫擴充模塊。Python編譯器本身也可以被集成到其它需要腳本語言的程序內。

5、在設計Python語言時,如果面臨多種選擇,Python開發者一般會拒絕花俏的語法,而選擇明確的沒有或者很少有歧義的語法。由於

這種設計觀念的差異,Python源代碼通常被認為比Perl具備更好的可讀性,並且能夠支撐大規模的軟體開發。這些准則被稱為Python格

言。在Python解釋器內運行import this可以獲得完整的列表。

6、Python既支持面向過程的函數編程也支持面向對象的抽象編程。在面向過程的語言中,程序是由過程或僅僅是可重用代碼的函數構建

起來的。在面向對象的語言中,程序是由數據和功能組合而成的對象構建起來的。與其他主要的語言如C++和Java相比,Python以一種

非常強大又簡單的方式實現面向對象編程。

7、可擴展性和可嵌入性。如果你需要你的一段關鍵代碼運行得更快或者希望某些演算法不公開,你可以把你的部分程序用C或C++編寫,

然後在你的Python程序中使用它們。你可以把Python嵌入你的C/C++程序,從而向你的程序用戶提供腳本功能。

8、豐富的庫。Python標准庫確實很龐大。python有可定義的第三方庫可以使用。它可以幫助你處理各種工作,包括正則表達式、文檔

生成、單元測試、線程、資料庫、網頁瀏覽器、CGI、FTP、電子郵件、XML、XML-RPC、HTML、WAV文件、密碼系統、GUI(圖形用

戶界面)、Tk和其他與系統有關的操作。記住,只要安裝了Python,所有這些功能都是可用的。這被稱作Python的「功能齊全」理念。

除了標准庫以外,還有許多其他高質量的庫,如wxPython、Twisted和Python圖像庫等等。

9、Python確實是一種十分精彩又強大的語言。它合理地結合了高性能與使得編寫程序簡單有趣的特色。

10、規范的代碼。Python採用強制縮進的方式使得代碼具有極佳的可讀性。

『捌』 Python常見的漏洞都有什麼

首先是解析XML漏洞。如果您的應用程序載入和解析XML文件,那麼您可能正在使用XML標准庫模塊。有一些針對XML的常見攻擊。大多數是DoS風格(旨在破壞系統而不是竊取數據)。這些攻擊很常見,尤其是在解析外部(即不受信任的)XML文件時。一種這樣的攻擊是“十億笑”,因為載入的文件包含許多(十億)“笑”。您可以載入XML實體文件,當XML解析器嘗試將此XML文件載入到內存中時,它將消耗許多GB的內存。

要知道SSTI是ServerSideTemplateInjection,是Web開發中使用的模板引擎。模板引擎可以將用戶界面和業務數據分離,邏輯代碼和業務代碼也可以相應分離,代碼復用變得簡單,開發效率也提高了。模板在伺服器端使用,數據由模板引擎渲染,然後傳遞給用戶,可以為特定用戶/特定參數生成對應的頁面。我們可以對比一下網路搜索,搜索不同詞條得到的結果頁面是不一樣的,但是頁面的邊框基本是一樣的。

『玖』 如何利用cURL和python對服務端和web端進行介面測試

工具描述

cURL是利用URL語法在命令行方式下工作的文件傳輸工具,是開源愛好者編寫維護的免費工具,支持包括Windows、Linux、Mac等數十個操作系統,最新版本為7.27.0,但是我推薦大家使用7.26.0,從這里可以下載7.26.0版本。

以下是官方介紹的翻譯:
cURL是一個使用URL語法來傳輸數據的命令行工具,支持
DICT,FILE,FTP,FTPS,GOPHER,HTTP,HTTPS,IMAP,IMAPS,LDAP,LDAPS,POP3,POP3S,RTMP,RTSP,SCP,SFTP,SMTP,SMTPS,Telnet
和TFTP。 cURL支持SSL證書,HTTP POST,HTTP
PUT,FTP上傳,HTTP基礎表單上傳,代理,cookies,用戶+密碼身份驗證(Basic, Digest, NTLM,
Negotiate, kerberos...),恢復文件傳輸,隧道代理等等。

Python是一種面向對象、直譯式計算機程序設計語言,由Guido van Rossum於1989年底發明,它的強大和易用就無需多做說明了,在web開發中或者對開發速度要求較高的開發中應用十分廣,不過因為屬於腳本類語言,它的性能始終比不上C++、C等語言。

本文主要利用實例說明這兩款工具的在測試中的部分用途,更多用法留待大家繼續探索。

應用場景

使用cURL模擬客戶端對服務端進行查詢

在進行介面測試時,應該先找開發人員提供介面列表和對應參數,這樣測試的時候就可以驗證測試方法是否正確,不過如果可以用瀏覽器模擬操作的話,也可以自己先試試的,後面的例子會提到。

首先使用客戶端訪問需要測試的服務端介面,用wireshark抓包結果如下:

把查詢字元串以multipart方式post數據到伺服器的file_health_info.php介面。

Tips:

Windows版的cURL不像Linux或者Mac一樣屬於系統自帶工具,需要下載,如果要在命令提示符下使用就需要跳轉到工具所在目錄下才能運
行,十分麻煩,我們可以直接把這個工具文件放到Windows目錄下,這樣無論在哪個目錄都可以直接使用「curl」命令運行工具了。

cURL默認就是以post方式發送數據的,所以只需要加入multipart方式就可以了,-F在cURL幫助中的解釋是:

-F, --form CONTENT Specify HTTP multipart POST data (H)

--form-string STRING Specify HTTP multipart POST data (H)

--ftp-account DATA Account data string (F)

--ftp-alternative-to-user COMMAND String to replace "USER [name]" (F)

--ftp-create-dirs Create the remote dirs if not present (F)

--ftp-method [MULTICWD/NOCWD/SINGLECWD] Control CWD usage (F)

--ftp-pasv Use PASV/EPSV instead of PORT (F)

Specify HTTP multipart POST data正好滿足我們的要求,所以模擬的語句是:

curl -F "newmd5=###25016566###d:\test.exe###1###" http://172.22.54.22/file_health_info.php

後面的都是參數,測試前就要找開發確認好。

不過因為服務端支持以gzip方式返回數據,所以我們還可以在請求中加入—compressed參數,即是:

curl --compressed -F "newmd5=###25016566###d:\test.exe###1###" http://172.22.54.22/file_health_info.php

為了更好判斷服務端介面是否正常,除了對返回數據進行判斷外,我們還需要對服務端返回的數據包頭進行解析,所以還可以在cURL請求中加入-i參數,最終這個測試語句就變為:

curl –i --compressed -F "newmd5=###25016566###d:\test.exe###1###" http://172.22.54.22/file_health_info.php

模擬完成後就要考慮判斷返回值的事了,我們首先在命令提示符下運行這個語句,看看返回值。

運行以上命令後,返回的數據如下:

HTTP/1.1 100 Continue

HTTP/1.1 200 OK

Date: Fri, 24 Aug 2012 07:47:45 GMT

Content-Type: application/xml

Transfer-Encoding: chunked

Connection: keep-alive

Server: 360 web server

Content-Encoding: gzip

<?xml version="1.0" encoding="GBK" ?>

<ret>

<retinfo code="0" msg="Operation success" total="1" success="1" empty="0"

cost="999.92752075195"/>

<softs>

<soft>

<md5></md5>

<sha1></sha1>

<level>4040</level>

<e_level>40.3</e_level>

<size></size>

<soft_name><![CDATA[]]> </soft_name>

<describ><![CDATA[]]></describ>

<file_desc><![CDATA[]]></file_desc>

<upload>0</upload>

<attr_upload>2</attr_upload>

<class><![CDATA[private]]></class>

<malware><![CDATA[cloud.virus]]></malware>

<is_sys_file>0</is_sys_file>

<is_rep>0</is_rep>

<age>0</age>

<pop>0</pop>

</soft>

</softs>

</ret>

數據包包頭是常見的,一般來說,我們只要判斷包頭中含有「HTTP/1.1 200
OK」就可以確定服務端正常返回了數據。另外從內容可以看到這是一個xml格式的數據包,我們只需要判斷是否存在關鍵的欄位即可,比
如<level>,確定這些之後我們就可以在python中添加如下案例代碼了:

首先運行指定的curl命令:

response = os.popen(『『『curl -i --compressed -F "newmd5=###25016566###d:\test.exe###1###" http://172.22.54.31/file_health_info.php

然後判斷返回值中是否存在我們想要的欄位:

self.assertNotEqual(response.find(『HTTP/1.1 200 OK『),-1)

self.assertNotEqual(response.find(『<level>『),-1)

上面的內容看起來差不多可以了,但實際還不夠嚴謹,因為服務端返回的這些數據是從資料庫中獲取的,所以我們還需要查詢資料庫獲取指定值,判斷是否和數據包中的一致,比如<level>:

首先使用python登錄資料庫伺服器:

conn = MySQLdb.connect(host=『172.22.54.31『, user=『user『,passwd=『test321『,db=『cloud『)

cursor = conn.cursor()

count = cursor.execute(『SELECT plevel FROM file where md5=""『)

result = cursor.fetchone()

然後判斷返回值中的level是否資料庫中的值:

self.assertNotEqual(response.find(『『『<level>%s</level>『『『%result[0]),-1)

測試時除了使用cURL等工具進行模擬,還可以自己用python或其他語言寫代碼進行post數據,不過當時簡單起見所以就選擇了用cURL測試。

使用cURL模擬控制台登錄

說到模擬登錄或者模擬點擊,很多同學可能直接聯想到QTP等模擬界面操作的工具,事實上這種工具有一個很大的弊端是太依賴控制項,如果界面控制項變了,
那麼可能整個腳本就無效了,現在的程序設計都傾向界面邏輯分離,這樣修改界面時就不會動到底下的功能介面,開發人員可以隨時修改界面控制項,如果還是採取
QTP等模擬點擊的方法測試,結果可能是事倍功半的,如果測試時直接點用介面就可以避免這種問題。

下面的例子是模擬控制台登錄的,登錄URL為:

http://172.22.54.31:8888/cloud/index.php?r=site/login ,首先使用瀏覽器登錄一次,看看實際效果如何。

Tips:

測試php或其他web程序時建議使用chrome,因為它自帶的Developer
Tools十分好用,當然firefox或者IE9也有類似的工具,看個人習慣吧。按F12打開工具,選擇Network標簽頁,然後輸入用戶名、密碼點
擊登錄,這時Network下方會顯示登錄過程中瀏覽器想控制台請求的所有數據,包括請求類型、表單數據等,這些是我們模擬操作的數據來源。

從上圖可以獲取幾個重點信息:請求URL、請求類型、數據類型、數據內容、並且支持gzip壓縮等。我們用curl模擬如下:

curl -i --compressed http://172.22.54.31:8888/cloud/index.php?r=site/login -d 「username=admin」 -d 「userpass=admin」

使用-i和—compressed的原因再上一個例子已經說了,這里不再贅述,重點是後面的-d,它在官方幫助的解釋是:

-d, --data DATA HTTP POST data (H)

--data-ascii DATA HTTP POST ASCII data (H)

--data-binary DATA HTTP POST binary data (H)

--data-urlencode DATA HTTP POST data url encoded (H)

--delegation STRING GSS-API delegation permission

--digest Use HTTP Digest Authentication (H)

--disable-eprt Inhibit using EPRT or LPRT (F)

--disable-epsv Inhibit using EPSV (F)

而我們從Developer Tools返回的數據已經知道,返回數據的格式是

「application/x-www-form-urlencoded」,所以很明顯需要使用-d的HTTP POST data url encoded特性。不過格式中還有關鍵字form,莫非也支持-F參數登錄,試試:

curl -i --compressed http://172.22.54.31:8888/cloud/index.php?r=site/login -F 「username=admin」 -F 「userpass=admin」,果然成功,呵呵~

也許有同學有疑問,為何不模擬warnsetup、refer,這是因為測試時發現登錄界面只需要用戶名和密碼就夠了,refer 用於記錄來源網頁,在這里用處不大,warnsetup只是用於驗證登錄碼的,這個已經去掉了。

接下來要驗證數據,我們在命令提示符中運行上面的命令,返回結果如下:

HTTP/1.1 302 Moved Temporarily

Date: Fri, 24 Aug 2012 08:29:07 GMT

Content-Type: text/html

Transfer-Encoding: chunked

Connection: keep-alive

X-Powered-By: PHP/5.4.3

Set-Cookie: PHPSESSID=; path=/

Expires: Thu, 19 Nov 1981 08:52:00 GMT

Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0

Pragma: no-cache

Set-Cookie: PHPSESSID=; path=/

Location: ./index.php

Server: 360 web server

很奇怪吧,乍一看控制台沒有返回任何有用信息,不過裡面那句HTTP/1.1 302 Moved
Temporarily是不是特別眼熟?這個特殊的302(表示http重定向)正是我們在Developer
Tools看到的狀態值,看到這個已經可以80%確定我們登錄已經成功了,更重要的是返回包中的內容:Location:
./index.php,這說明控制台已經通知請求端跳轉到index.php,如果登錄失敗控制台會繼續停留在當前登錄界面的,我們只需要修改curl
語句中的用戶名或者密碼就知道了,這種情況下返回包就是登錄界面的php源碼,這里不再贅述。

使用cURL以get方式測試控制台搜索介面

測試方法同上面差不多,首先使用chrome打開控制台進入對應頁面,在搜索框中輸入「test.exe」,點擊搜索,使用developer tools抓包,內容如下:

cURL模擬get方式發送數據的參數是-G,了解這個後面要模擬就很簡單了:

curl -i --compressed -G 「http://172.22.54.31:8888/cloud/index.php?r=file_cloud/api/search&filename=&bg=0&lm=19


其中每個參數的含義要分別了解:filename表示輸入的關鍵字,bg表示資料庫第一行,lm表示共顯示19行數據。這個介面返回的數據如下:

{"rows":[{"level":"10","plevel":"10","id":"20","md5":"","soft_name":"","soft_desc":"","file_desc":"","is_sys_file":"127","size":"41984","is_rep":"0","file_name":"apihex86.d

ll","file_version":"6.1.7600.16385","proct_version":"6.1.7600.16385","right":"\u00a9 Microsoft Corporation. All rights reserved.","lang":"0","org_name":"YXBpaGV4ODYuZGxs","sign_name":"TWljcm9zb2Z0IFdpbmRvd3M=","company_name":"Microsof

t Corporation","update_time":"2012-07-31 18:14:27","create_time":"2012-07-31 18:14:27","creator_mid":""}],"count":"1"}

分別是文件屬性和文件信息,這涉及到兩個資料庫表,所以驗證數據需要用python從兩張表中獲取對應信息。

從第一張表獲取文件屬性,比如只獲取plevel:

SELECT plevel FROM `file` where md5=""

從第二張表獲取文件信息,比如只獲取company_name:

SELECT company_name FROM file_info where md5=""

Python代碼如下:

conn = MySQLdb.connect(host=『%s『% self.host, user=『user『,passwd=『test321『,db=『cloud『)

cursor = conn.cursor()

count = cursor.execute(『SELECT plevel FROM `file` where md5=""『)

result = cursor.fetchone()

self.assertNotEqual(response.find(str(result[0])),-1)

count = cursor.execute(『SELECT company_name FROM file_info where md5=""『)

result1 = cursor.fetchone()

self.assertNotEqual(response.find(result1[0]),-1)

當然嚴謹的測試案例是每一個屬性欄位都需要進行查找和匹配,這里就不再贅述了。

『拾』 如何利用cURL和python對服務端和web端進行介面測試

工具描述
cURL是利用URL語法在命令行方式下工作的文件傳輸工具,是開源愛好者編寫維護的免費工具,支持包括Windows、Linux、Mac等數十個操作系統,最新版本為7.27.0,但是我推薦大家使用7.26.0,從這里可以下載7.26.0版本。
以下是官方介紹的翻譯: cURL是一個使用URL語法來傳輸數據的命令行工具,支持DICT,FILE,FTP,FTPS,GOPHER,HTTP,HTTPS,IMAP,IMAPS,LDAP,LDAPS,POP3,POP3S,RTMP,RTSP,SCP,SFTP,SMTP,SMTPS,Telnet和TFTP。 cURL支持SSL證書,HTTP POST,HTTP PUT,FTP上傳,HTTP基礎表單上傳,代理,cookies,用戶+密碼身份驗證(Basic, Digest, NTLM, Negotiate, kerberos...),恢復文件傳輸,隧道代理等等。
Python是一種面向對象、直譯式計算機程序設計語言,由Guido van Rossum於1989年底發明,它的強大和易用就無需多做說明了,在web開發中或者對開發速度要求較高的開發中應用十分廣,不過因為屬於腳本類語言,它的性能始終比不上C++、C等語言。
本文主要利用實例說明這兩款工具的在測試中的部分用途,更多用法留待大家繼續探索。
應用場景
使用cURL模擬客戶端對服務端進行查詢
在進行介面測試時,應該先找開發人員提供介面列表和對應參數,這樣測試的時候就可以驗證測試方法是否正確,不過如果可以用瀏覽器模擬操作的話,也可以自己先試試的,後面的例子會提到。
首先使用客戶端訪問需要測試的服務端介面,用wireshark抓包結果如下:

把查詢字元串以multipart方式post數據到伺服器的file_health_info.php介面。
Tips:
Windows版的cURL不像Linux或者Mac一樣屬於系統自帶工具,需要下載,如果要在命令提示符下使用就需要跳轉到工具所在目錄下才能運行,十分麻煩,我們可以直接把這個工具文件放到Windows目錄下,這樣無論在哪個目錄都可以直接使用「curl」命令運行工具了。
cURL默認就是以post方式發送數據的,所以只需要加入multipart方式就可以了,-F在cURL幫助中的解釋是:

-F, --form CONTENT Specify HTTP multipart POST data (H)
--form-string STRING Specify HTTP multipart POST data (H)
--ftp-account DATA Account data string (F)
--ftp-alternative-to-user COMMAND String to replace "USER [name]" (F)
--ftp-create-dirs Create the remote dirs if not present (F)
--ftp-method [MULTICWD/NOCWD/SINGLECWD] Control CWD usage (F)
--ftp-pasv Use PASV/EPSV instead of PORT (F)

Specify HTTP multipart POST data正好滿足我們的要求,所以模擬的語句是:
curl -F "newmd5=###25016566###d:\test.exe###1###" file_health_info.php
後面的都是參數,測試前就要找開發確認好。
不過因為服務端支持以gzip方式返回數據,所以我們還可以在請求中加入—compressed參數,即是:
curl --compressed -F "newmd5=###25016566###d:\test.exe###1###"file_health_info.php
為了更好判斷服務端介面是否正常,除了對返回數據進行判斷外,我們還需要對服務端返回的數據包頭進行解析,所以還可以在cURL請求中加入-i參數,最終這個測試語句就變為:
curl –i --compressed -F "newmd5=###25016566###d:\test.exe###1###"file_health_info.php
模擬完成後就要考慮判斷返回值的事了,我們首先在命令提示符下運行這個語句,看看返回值。
運行以上命令後,返回的數據如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

HTTP/1.1 100 Continue
HTTP/1.1 200 OK
Date: Fri, 24 Aug 2012 07:47:45 GMT
Content-Type: application/xml
Transfer-Encoding: chunked
Connection: keep-alive
Server: 360 web server
Content-Encoding: gzip
<?xml version="1.0" encoding="GBK" ?>
<ret>
<retinfo code="0" msg="Operation success" total="1" success="1" empty="0"
cost="999.92752075195"/>
<softs>
<soft>
<md5></md5>
<sha1></sha1>
<level>4040</level>
<e_level>40.3</e_level>
<size></size>
<soft_name><![CDATA[]]> </soft_name>
<describ><![CDATA[]]></describ>
<file_desc><![CDATA[]]></file_desc>
<upload>0</upload>
<attr_upload>2</attr_upload>
<class><![CDATA[private]]></class>
<malware><![CDATA[cloud.virus]]></malware>
<is_sys_file>0</is_sys_file>
<is_rep>0</is_rep>
<age>0</age>
<pop>0</pop>
</soft>
</softs>
</ret>

數據包包頭是常見的,一般來說,我們只要判斷包頭中含有「HTTP/1.1 200 OK」就可以確定服務端正常返回了數據。另外從內容可以看到這是一個xml格式的數據包,我們只需要判斷是否存在關鍵的欄位即可,比如<level>,確定這些之後我們就可以在python中添加如下案例代碼了:
首先運行指定的curl命令:
response = os.popen('''curl -i --compressed -F "newmd5=###25016566###d:\test.exe###1###"
然後判斷返回值中是否存在我們想要的欄位:
self.assertNotEqual(response.find('HTTP/1.1 200 OK'),-1)
self.assertNotEqual(response.find('<level>'),-1)
上面的內容看起來差不多可以了,但實際還不夠嚴謹,因為服務端返回的這些數據是從資料庫中獲取的,所以我們還需要查詢資料庫獲取指定值,判斷是否和數據包中的一致,比如<level>:
首先使用python登錄資料庫伺服器:
conn = MySQLdb.connect(host='172.22.54.31', user='user',passwd='test321',db='cloud')
cursor = conn.cursor()
count = cursor.execute('SELECT plevel FROM file where md5=""')
result = cursor.fetchone()
然後判斷返回值中的level是否資料庫中的值:
self.assertNotEqual(response.find('''<level>%s</level>'''%result[0]),-1)
測試時除了使用cURL等工具進行模擬,還可以自己用python或其他語言寫代碼進行post數據,不過當時簡單起見所以就選擇了用cURL測試。

使用cURL模擬控制台登錄
說到模擬登錄或者模擬點擊,很多同學可能直接聯想到QTP等模擬界面操作的工具,事實上這種工具有一個很大的弊端是太依賴控制項,如果界面控制項變了,那麼可能整個腳本就無效了,現在的程序設計都傾向界面邏輯分離,這樣修改界面時就不會動到底下的功能介面,開發人員可以隨時修改界面控制項,如果還是採取QTP等模擬點擊的方法測試,結果可能是事倍功半的,如果測試時直接點用介面就可以避免這種問題。
下面的例子是模擬控制台登錄的,登錄URL為:
index.php?r=site/login ,首先使用瀏覽器登錄一次,看看實際效果如何。
Tips:
測試php或其他web程序時建議使用chrome,因為它自帶的Developer Tools十分好用,當然firefox或者IE9也有類似的工具,看個人習慣吧。按F12打開工具,選擇Network標簽頁,然後輸入用戶名、密碼點擊登錄,這時Network下方會顯示登錄過程中瀏覽器想控制台請求的所有數據,包括請求類型、表單數據等,這些是我們模擬操作的數據來源。

從上圖可以獲取幾個重點信息:請求URL、請求類型、數據類型、數據內容、並且支持gzip壓縮等。我們用curl模擬如下:
curl -i --compressed cloud/index.php?r=site/login -d 「username=admin」 -d 「userpass=admin」
使用-i和—compressed的原因再上一個例子已經說了,這里不再贅述,重點是後面的-d,它在官方幫助的解釋是:

-d, --data DATA HTTP POST data (H)
--data-ascii DATA HTTP POST ASCII data (H)
--data-binary DATA HTTP POST binary data (H)
--data-urlencode DATA HTTP POST data url encoded (H)
--delegation STRING GSS-API delegation permission
--digest Use HTTP Digest Authentication (H)
--disable-eprt Inhibit using EPRT or LPRT (F)
--disable-epsv Inhibit using EPSV (F)

而我們從Developer Tools返回的數據已經知道,返回數據的格式是
「application/x-www-form-urlencoded」,所以很明顯需要使用-d的HTTP POST data url encoded特性。不過格式中還有關鍵字form,莫非也支持-F參數登錄,試試:
curl -i --compressed cloud/index.php?r=site/login -F 「username=admin」 -F 「userpass=admin」,果然成功,呵呵~
也許有同學有疑問,為何不模擬warnsetup、refer,這是因為測試時發現登錄界面只需要用戶名和密碼就夠了,refer 用於記錄來源網頁,在這里用處不大,warnsetup只是用於驗證登錄碼的,這個已經去掉了。
接下來要驗證數據,我們在命令提示符中運行上面的命令,返回結果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13

HTTP/1.1 302 Moved Temporarily
Date: Fri, 24 Aug 2012 08:29:07 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
X-Powered-By: PHP/5.4.3
Set-Cookie: PHPSESSID=; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Set-Cookie: PHPSESSID=; path=/
Location: ./index.php
Server: 360 web server

很奇怪吧,乍一看控制台沒有返回任何有用信息,不過裡面那句HTTP/1.1 302 Moved Temporarily是不是特別眼熟?這個特殊的302(表示http重定向)正是我們在Developer Tools看到的狀態值,看到這個已經可以80%確定我們登錄已經成功了,更重要的是返回包中的內容:Location: ./index.php,這說明控制台已經通知請求端跳轉到index.php,如果登錄失敗控制台會繼續停留在當前登錄界面的,我們只需要修改curl語句中的用戶名或者密碼就知道了,這種情況下返回包就是登錄界面的php源碼,這里不再贅述。
使用cURL以get方式測試控制台搜索介面
測試方法同上面差不多,首先使用chrome打開控制台進入對應頁面,在搜索框中輸入「test.exe」,點擊搜索,使用developer tools抓包,內容如下:

cURL模擬get方式發送數據的參數是-G,了解這個後面要模擬就很簡單了:
curl -i --compressed -G 「cloud/index.php?r=file_cloud/api/search&filename=&bg=0&lm=19 」
其中每個參數的含義要分別了解:filename表示輸入的關鍵字,bg表示資料庫第一行,lm表示共顯示19行數據。這個介面返回的數據如下:
{"rows":[{"level":"10","plevel":"10","id":"20","md5":"","soft_name":"","soft_desc":"","file_desc":"","is_sys_file":"127","size":"41984","is_rep":"0","file_name":"apihex86.d
ll","file_version":"6.1.7600.16385","proct_version":"6.1.7600.16385","right":"\u00a9 Microsoft Corporation. All rights reserved.","lang":"0","org_name":"YXBpaGV4ODYuZGxs","sign_name":"TWljcm9zb2Z0IFdpbmRvd3M=","company_name":"Microsof
t Corporation","update_time":"2012-07-31 18:14:27","create_time":"2012-07-31 18:14:27","creator_mid":""}],"count":"1"}
分別是文件屬性和文件信息,這涉及到兩個資料庫表,所以驗證數據需要用python從兩張表中獲取對應信息。
從第一張表獲取文件屬性,比如只獲取plevel:
SELECT plevel FROM `file` where md5=""
從第二張表獲取文件信息,比如只獲取company_name:
SELECT company_name FROM file_info where md5=""
Python代碼如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

conn = MySQLdb.connect(host='%s'% self.host, user='user',passwd='test321',db='cloud')

cursor = conn.cursor()

count = cursor.execute('SELECT plevel FROM `file` where md5=""')

result = cursor.fetchone()

self.assertNotEqual(response.find(str(result[0])),-1)

count = cursor.execute('SELECT company_name FROM file_info where md5=""')

result1 = cursor.fetchone()

self.assertNotEqual(response.find(result1[0]),-1)

當然嚴謹的測試案例是每一個屬性欄位都需要進行查找和匹配,這里就不再贅述了。
後記:這種介面測試用到的無非就是curl、python的unitest而已,可能有的人會疑問,為什麼用curl而不用py自帶的pycurl或者request之類,我覺得只要能滿足需求,能夠用現成的就用現成的,怎麼簡單怎麼來。搞一堆代碼維護起來也麻煩啊,現在qa行業跳槽也比較頻繁,萬一換了個人看不懂你的代碼怎麼辦?呵呵

閱讀全文

與python邏輯與界面分離相關的資料

熱點內容
ai文件pdf 瀏覽:907
騰訊雲伺服器掛載混合雲 瀏覽:758
智能小車用什麼單片機 瀏覽:463
java怎麼給窗口關閉 瀏覽:940
列舉51單片機的定址方式 瀏覽:706
剪輯app怎麼寫長篇文字 瀏覽:400
app專屬流量過月租怎麼不更新 瀏覽:654
王者程序員都有誰 瀏覽:76
給牛換腳掌解壓 瀏覽:387
圍棋有多少種演算法 瀏覽:602
unity資源包在哪個文件夾 瀏覽:704
阿里雲伺服器遠程鏈接不成功 瀏覽:482
文件系統pdf 瀏覽:766
原神安卓區服什麼意思 瀏覽:37
貝殼app怎麼線上發布 瀏覽:159
如何挑選安卓系統機頂盒 瀏覽:54
安卓快充使用有什麼注意事項 瀏覽:909
黑馬程序員的雲計算網課 瀏覽:947
endnotestyle文件夾怎麼導入 瀏覽:460
講解少兒編程演講會開頭 瀏覽:426