http://www.javashuo.com/article/p-yxfkvshy-mm.htmljava
在程序模塊下面的build.gradle中須要引入的依賴包:通常Androidstudio新建項目就會自動生成node
testImplementation-引入的依賴是java unit單元測試,是運行在當前電腦的jvm上的單元測試;android
androidTestImplementation-引入的依賴是Android單元測試,是運行在Android環境的單元測試。json
若是AndroidStudio當前項目視圖爲Android,須要切換爲Project視圖,在程序模塊下面的src目錄下添加androidTest/java(Android單元測試,運行在Android環境的單元測試)和test/java(JUnit單元測試,運行在當前電腦的jvm上的單元測試),而後在裏面添加包名和測試類。api
androidTest測試類適用於須要依賴Android api的單元測試,須要鏈接Android設備才能進行測試。新建的androidTest java類須要添加@RunWith(AndroidJUnit4.class)註解,類的方法若是是測試入口方法須要添加@Test註解。
示例代碼:路徑 app\src\androidTest\java\com\example\itandroid_1app
public class MainActivityTest {
private Context mTargetContext; @Before public void setUP() throws Exception { mTargetContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); } @Test public void onCreate() { try { ApplicationInfo applicationInfo = mTargetContext.getPackageManager().getApplicationInfo(mTargetContext.getPackageName(), PackageManager.GET_META_DATA); Bundle metaData = applicationInfo.metaData; String data = metaData.getString("com.panzq.Androidtest"); assertEquals("123456", data); } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } } }
public class TestUtil {
@Before
public void setUp() throws Exception { } @Test public void isEmpty() { assertEquals(true, TextUtils.isEmpty("")); } }
在測試類中的setUp方法,能夠在啓動測試前進行一些初始化,好比測試類中的變量等初始化,這個方法須要添加@Before註解。dom
說明:
上面的示例代碼中能夠直接使用assertEquals,是由於使用了靜態import方法引入了相應的包(import static org.junit.Assert.*;)
根據測試的功能合理使用androidTest和test,提升單元測試效率。
2.2 自動生成測試類和測試方法
上面介紹的是手動添加測試類和測試方法,如下介紹自動生成測試類和方法。在項目源碼中選中須要添加單元測試的類並打開,在內容顯示區域「右鍵」->「Go To」,在彈出窗口中選擇「Test」,在彈出窗口中選擇「Create New Test ......」jvm
在接下來彈出的對話框中,勾選須要添加單元測試的方法,在這裏有個「Generate」通用方法生成,能夠選擇setUp/@Before(啓動前調用,可用於初始化)和tearDown/@After(結束後調用)ide
在終端使用gradle運行test任務,能夠執行全部的單元測試方法(在AndroidStudio的Terminal運行gradlew test,在系統終端中運行gradle -p 項目路徑 test,gradle沒有配置環境變量,須要絕對路徑),運行完成後,就會運行全部的單元測試方法,而且會顯示結果,以下圖:性能
<?xml version ="1.0" encoding ="utf-8"?> <中國> <北京> <昌平></昌平> <海淀></海淀> </北京> </中國>
<?xml version ="1.0" encoding ="utf-8"?>文檔聲明必須寫在第一行
保存的時候xml聲明的編碼要跟文件保存的編碼保存一致,若是不聲明編碼默認utf-8
<中國> <北京> <昌平></昌平> <海淀></海淀> </北京> </中國>
1.屬性要寫在開始標籤中
2.屬性的命名規則跟元素的命名規則同樣
3.屬性必定要用引號包起來,單引號雙引號均可以
4.屬性的內容能夠用子標籤形式表示
<!-- 註釋-->
CDATA 註釋 能夠包含大於小於號,不會被解析器解析
<![CDATA[<北京></北京>]]>
特殊字符 | 特殊字符 |
& | & |
< | < |
> | > |
" | " |
' | ' |
https://www.w3school.com.cn/schema/schema_howto.asp
dom解析xml的優勢:
由於分配了一個樹形結構,很方便的實現增長修改刪除操做
dom解析xml的缺點
若是要解析文件過大,一次性哎內存中分配一個樹形結構,操做內存的溢出。
public class DomParseUtil { public void domParse() { //1.獲取DocumentBuilderFactory DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); try { //2.獲取DocumentBuilder DocumentBuilder documentBuilder = builderFactory.newDocumentBuilder(); //3.經過DocumentBuilder解析xml文檔得到Document對象 Document document = documentBuilder.parse("xml.xml"); //4.經過元素的名字能夠找到元素的集合 NodeList nodeList = document.getElementsByTagName("書名"); //獲取節點個數nodeList.getLength(); for (int i = 0; i < nodeList.getLength(); i++) { //5.找到第二個元素,第二個書名 Node node = nodeList.item(1); //6.讀取對應節點的文本內容 String content = node.getTextContent(); } } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public void domModifyXml() { DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); try { DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); Document document = documentBuilder.parse("book.xml"); NodeList nodeList = document.getElementsByTagName("售價"); Node node = nodeList.item(1); node.setTextContent("99.00元"); //修改xml中的內容,只有dom能夠修改 TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); Source xmlSource = new DOMSource(document); Result outputTarget = new StreamResult("book.xml"); transformer.transform(xmlSource, outputTarget); } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (TransformerConfigurationException e) { e.printStackTrace(); } catch (TransformerException e) { e.printStackTrace(); } } }
sax解析方式:邊讀邊解析
使用sax方式督導特定的標籤時候,自動調用相應的方式進行操做
sax解析xml的優勢: 不會形成內存溢出
sax解析缺點:不能修改xml文件
public class SaxParseUtil { private MycontentHandler handler; private ArrayList<BookBean> books = new ArrayList<>(); private String tag; private BookBean bookBean; public SaxParseUtil() { this.handler = new MycontentHandler(); } public void saxParser() { //獲取工廠 SAXParserFactory saxParserFactory = SAXParserFactory.newInstance(); try { SAXParser saxParser = saxParserFactory.newSAXParser(); //獲取xmlReader經過reader能夠試着獲取ContentHandler XMLReader xmlReader = saxParser.getXMLReader(); //給xmlReader設置ContentHandler ContentHandler是一個接口,裏面太多的方法沒實現 //不去直接實現ContentHandler而是繼承它默認的實現DefaultHandler xmlReader.setContentHandler(handler); //開始解析文檔 這裏傳入xml路徑 xmlReader.parse("book.xml"); } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } private class MycontentHandler extends DefaultHandler { @Override public void startDocument() throws SAXException { Log.d("panzq", "文檔開始"); } @Override public void endDocument() throws SAXException { Log.d("panzq", "文檔開始"); } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { Log.d("panzq", "開始標籤" + qName); if ("書架".equals(qName)) { books = new ArrayList<>(); } else if ("書".equals(qName)) { bookBean = new BookBean(); } else if ("書名".equals(qName)) { tag = "書名"; } else if ("做者".equals(qName)) { tag = "做者"; } else if ("售價".equals(qName)) { tag = "售價"; } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { Log.d("panzq", "結束標籤" + qName); tag = null; if ("書架".equals(qName)) { for (BookBean bookBean : books) { Log.d("panzq", "books : " + books); } } else if ("書".equals(qName)) { books.add(bookBean); } } @Override public void characters(char[] ch, int start, int length) throws SAXException { String text = new String(ch, start, length);//拿到具體的文本 Log.d("panzq", "文本內容" + text); if (tag.equals("書名")) { bookBean.setTitle(text); } else if (tag.equals("做者")) { bookBean.setAuthor(text); } else if (tag.equals("售價")) { bookBean.setPrice(text); } } } }
public class PullParserUtil { public void pullTest() { try { //獲取工廠 XmlPullParserFactory xmlPullParserFactory = XmlPullParserFactory.newInstance(); //獲取xml的解析器 XmlPullParser xmlPullParser = xmlPullParserFactory.newPullParser(); //給解析器設置一個輸入源 //第一個參數輸入流 第二個參數 文檔用到的字符編碼器 xmlPullParser.setInput(new FileInputStream(new File("book.xml")), "utf-8"); //獲取當前事件類型 int eventType = xmlPullParser.getEventType(); ArrayList<BookBean> books = null; BookBean bookBean = null; while (eventType != XmlPullParser.END_DOCUMENT) { switch (eventType) { case XmlPullParser.START_TAG: //xmlPullParser.getName()獲取當前事件對應的元素的名字 if ("書架".equals(xmlPullParser.getName())) { //建立一個集合 books = new ArrayList<>(); } else if ("書".equals(xmlPullParser.getName())) { //建立一個book對象 bookBean = new BookBean(); } else if ("書名".equals(xmlPullParser.getName())) { //xmlPullParser.nextText()獲取當前節點的下一個內容 bookBean.setTitle(xmlPullParser.nextText()); } else if ("做者".equals(xmlPullParser.getName())) { bookBean.setAuthor(xmlPullParser.nextText()); } else if ("售價".equals(xmlPullParser.getName())) { bookBean.setPrice(xmlPullParser.nextText()); } break; case XmlPullParser.END_TAG: if ("書".equals(xmlPullParser.getName())) { books.add(bookBean); } break; } //調用xmlPullParser.next()方法解析下一個元素,用這個結果來更新eventType若是解析到文檔結束那麼就會退出 //若是不更新這個eventType就是死循環 eventType = xmlPullParser.next(); } } catch (XmlPullParserException e) { e.printStackTrace(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
public void JsonParser() { String jstring = "{'name':'張三','age':'20'}"; try { JSONObject jsonObject = new JSONObject(jstring); String name = jsonObject.getString("name"); int age = jsonObject.getInt("age"); Log.d("panzq", "name = " + name + " , age = " + age); } catch (JSONException e) { e.printStackTrace(); } String jsonArray="[{'name':'張三','age':'20'},{'name':'李四','age':'30'}]"; try { JSONArray array = new JSONArray(jsonArray); for (int i=0;i<array.length();i++) { JSONObject jsonObject = array.getJSONObject(i); String name = jsonObject.getString("name"); int age = jsonObject.getInt("age"); Log.d("panzq", "name = " + name + " , age = " + age); } } catch (JSONException e) { e.printStackTrace(); } }